- 当一个功能函数,我们添加了多个额外功能时,这是我们就要使用多层装饰器;多层装饰器使用时是按就就近原则
def makebold(fn):
print('加载makebold')
def wrapper():
print('执行makebold中wrapper函数')
return "<b>" + fn() + "</b>"
return wrapper
def makeitalic(fn):
print('加载makeitalic')
def wrapper():
print('执行makeitalic中wrapper函数')
return "<i>" + fn() + "</i>"
return wrapper
@makebold #hello = makebold(wrapper)
@makeitalic #wrapper = makeitalic(hello)
def hello():
return "hello alvin"
print(hello())
执行结果
加载makeitalic
加载makebold
执行makebold中wrapper函数
执行makeitalic中wrapper函数
<b><i>hello alvin</i></b>
- 再来看看类装饰器,相比函数装饰器,类装饰器具有灵活度大、高内聚、封装性等优点。使用类装饰器还可以依靠类内部的__call__方法,当使用 @ 形式将装饰器附加到函数上时,就会调用此方法。
import time
class Foo(object):
def __init__(self, func):
self._func = func
def __call__(self):
start_time=time.time()
self._func()
end_time=time.time()
print('spend %s'%(end_time-start_time))
@Foo #bar=Foo(bar)
def bar():
print ('bar')
time.sleep(2)
bar() #bar=Foo(bar)()>>>>>>>没有嵌套关系了,直接active Foo的 __call__方法