多个装饰器可以共同修饰一个函数,多装饰器的执行顺序从近到远或者说由下而上。其格式如下
@outer2
@outer1
def foo(*args, **kwargs):
pass
上述写法相当于
@outer2
def outer1(foo):
pass
而decrator_b(foo)返回的就是一个可调用对象,多个装饰器也可以看成只有最外层的一个。这样函数foo经过装饰器装饰后,实际上等价于
foo= outer2 (outer1(foo))
如下代码
import time
def outer1(func):
#定义一个内嵌的包装函数,给传入的函数加上计时功能的包装
print("in outer1")
def inner1(*args, **kwargs):
'''inner decorator'''
print("ininner1")
start = time.clock()
ret = func(*args, **kwargs)
end = time.clock()
print('used:', end - start)
return ret
#将包装后的函数返回
return inner1
def outer2(func):
#定义一个内嵌的包装函数,给传入的函数加上计时功能的包装
print("in outer2")
def inner2(*args, **kwargs):
'''inner decorator'''
print("ininner2")
ret = func(*args, **kwargs)
return ret
#将包装后的函数返回
return inner2
当用outer1、outer2修饰下面这个函数的时候,
>>> @outer2
... @outer1
... def foo(*args, **kwargs):
... '''docstring'''
... print("in foo()")
... return "hello"+args[0]
...
in outer1
in outer2
>>>
>>> foo('world')
in inner2
in inner1
in foo()
('used:', 0.0)
'hello world'
>>>
它其实等价于下列代码
>>> def foo(*args, **kwargs):
... '''docstring'''
... print("in foo()")
... return "hello"+args[0]
...
>>> foo=outer2(outer1(foo))
in outer1
in outer2
>>> foo('world')
in inner2
in inner1
in foo()
('used:', 0.0)
'hello world'
>>>
网友评论