装饰器Decorator Pattern
向已有的对象添加新的功能,同时又不改变其结构
目的:动态给一个对象添加新的功能,装饰器相比于生成子类更加灵活
解决:我们为了扩展一个类使用继承方式,导致子类很冗余。
优点:装饰类和被装饰类可以独立发展,不会相互耦合、
缺点:多层装饰比较复杂
使用场景:扩展一个类的功能,动态增加一个类的功能,和动态撤销
注意事项:可以代替继承
函数也是一个对象,因此可以将函数赋给变量
1.计算add()函数的时间
def add(a,b):
res = a + B
return res
一般写法
import time
def add(a,b):
start_time = time.time()
res = a + b
exec_time = time.time()-start_time
print(‘加法花费时间{}’.format(exec_time))
return res
但是如果还要写一个计算减法的时间,可能也要写这么多,而且要逐步修改
import time
def sub(a,b):
start_time = time.time()
res = a - b
exec_time = time.time()-start_time
print(‘减法花费时间{}’.format(exec_time))
return res
这样写代码的话就会感觉到很冗余,不灵活
因此我们引入装饰器
定义一个装饰器的写法
一般写一个装饰器可以参考这个模板
import time
#定义装饰器
def time_calc(func):
def wrapper(*args,**kargs):
Start_time = time.time()
f = func(*args,**kargs) #这里是被装饰的函数,很重要
ecex_time = time.time() - start_time
return f
return wrapper
使用装饰器案例
#使用装饰示例
@time_calc
def add(a,b):
return a + b
@time_calc
def sub(a, b):
Return a - b
这样看起来就好看多了,更pythonic了
参考资料1https://www.zhihu.com/question/26930016/answer/1047233982
参考资料2https://www.runoob.com/design-pattern/decorator-pattern.html