装饰器:在不改动其他代码的前提下,添加额外的功能。
参考资料:如何理解Python装饰器?
装饰器
def newfunc(func):
def baozhuang():
func()#原有功能包裹在函数中
addNewFunc()#新添加的功能,像装饰了func()函数
return baozhuang
@newfunc
func()
带参数的装饰器
加多一层
def newfunc(status):
def lalala(func)
def wrapper(*args, **kwargs):
if status == doSth
func()#原有功能包裹在函数中
addNewFunc()#新添加的功能,像装饰了func()函数
return wrapper
return lalala
@newfunc(status = 'doSth')
def oldfunc()
pass
事例
——————————————————————————————————————————————————————
比如有如下的原有功能——打电话:
def ming():
print("小明打电话")
def hong():
print("小红打电话")
后来想让小明或小红打通电话后加入新功能——打招呼:
一开始比较直观的做法肯定是在原有函数的下面加一句
def ming():
print("小明打电话")
print("say:hello")#新增功能
def hong():
print("小红打电话")
print("say:hello")#新增功能
因为目前要加的功能只有上面这一句话print("say:hello"),所以看起来还没有那么的啰嗦。但如果是一个需要几百行代码才能实现的功能呢?总不能每个函数都把这几百行代码复制粘贴一次。这样代码的重复性就很高,可读性也变差了。
下面用装饰器来实现一下添加-打招呼-的新功能
def sayHello(func):
#用于打招呼
def wrapper():
func()
print("say:hello")
return wrapper
@sayHello #装饰器的语法糖
def ming():
print("小明打电话")
@sayHello
def hong():
print("小红打电话")
然后看一下输出效果
hong()
print("————我是分割线————")
ming()
小红打电话
say:hello
————我是分割线————
小明打电话
say:hello
类的装饰器
新建一个类(如Foo),重写__call__方法
@Foo 附加到函数上时
class Foo(object):
def __init__(self, func):
self._func = func
def __call__(self):
print('class decorator runing')
self._func()
print('class decorator ending')
@Foo
def bar():
print('bar')
bar()