• 17_Python装饰器


    一、什么是装饰器

    目的:给func()方法,增加一个功能,在fun()执行期间,同时把fun()执行速率机算出来

     1 import time
     2 def func():
     3     print('嘻嘻哈哈')
     4 
     5     
     6 start_time = time.time()
     7 time.sleep(0.1)
     8 func()
     9 end_time = time.time()
    10 print('----> 执行效率%s'%(end_time - start_time))

    如果,我们给fun1,fun2,fun3,实现相同的功能呢?

     1 def func():
     2     print('嘻嘻哈哈')
     3 
     4 def timmer(f):
     5     start_time = time.time()
     6     time.sleep(0.1)
     7     f()
     8     end_time = time.time()
     9     print('----> 执行效率%s'%(end_time - start_time))
    10 
    11 f = func
    12 func = timmer
    13 func(f)

    但是,每次都需要将函数作为函数,传递给timmer(),而且这种方式已经破坏了原有的逻辑结构,之前的逻辑结构,是执行fun的同时,计算执行效率,但是现在是把fun传给第三方函数,进行计算。

    怎么解决这种问题呢,装饰器。

    装饰器就是:在不改动原函数代码前提下,增加额外的功能,装饰的返回值也是一个函数对象。

     1 def func():
     2      print('嘻嘻哈哈')
     3      
     4      
     5 def timmer(f):
     6     start_time = time.time()
     7     time.sleep(0.1)
     8     f()
     9     end_time = time.time()
    10     print('----> 执行效率%s'%(end_time - start_time))
    11     return timmer
    12 
    13 f = timmer(func)
    14 f()

    @语法糖 : 在定义函数的时候使用,避免再一次赋值操作。

    代码修改如下:

     1 def timmer(f):
     2     start_time = time.time()
     3     time.sleep(0.1)
     4     f()
     5     end_time = time.time()
     6     print('----> 执行效率%s'%(end_time - start_time))
     7     return timmer
     8 
     9 @timmer
    10 def func():
    11      print('嘻嘻哈哈')

    二、带参数的装饰器

     1 import time
     2 
     3 
     4 def wrapper(f):
     5     def inner(*args,**kwargs):
     6         start_time = time.time()
     7         time.sleep(0.1)
     8         f(*args,**kwargs)
     9         end_time = time.time()
    10         print('----> 执行效率%s' % (end_time - start_time))
    11     return inner
    12 
    13 @wrapper
    14 def fun(a):
    15     print("%s嘻嘻哈哈" %(a))
    16 
    17 @wrapper
    18 def fun1(a,b):
    19     print('%s嘻嘻哈哈,%s也跟着嘻嘻哈哈' %(a,b))

    三、带返回值的装饰器

     1 def wrapper(f):
     2     def inner(*args,**kwargs):
     3         start_time = time.time()
     4         time.sleep(0.1)
     5         ret = f(*args,**kwargs)
     6         end_time = time.time()
     7         print('----> 执行效率%s' % (end_time - start_time))
     8         return ret
     9     return inner
    10 
    11 @wrapper
    12 def fun(a):
    13     s = "%s嘻嘻哈哈" %(a)
    14     return s
    15 
    16 print(name)

    总结:就是   我们调用 fun() 方法,实现原来的功能,并且增加新的功能,前提不能修改源代码。

  • 相关阅读:
    空气墙的制作,标签的添加
    子弹朝向问题的解决,移动方法的编写
    子弹的朝向问题
    坦克的攻击方法
    移动优先级的添加,2D渲染层级问题
    碰撞器的添加,解决抖动问题
    控制图片的移动切换
    控制玩家的移动
    游戏中预制体的制作,2D动画的制作
    场景搭建,素材的处理
  • 原文地址:https://www.cnblogs.com/weihengblog/p/8406842.html
Copyright © 2020-2023  润新知