装饰器是可调用的对象,其参数是另一个函数(被装饰的函数)。装饰器可能会处理被装饰的函数,然后把它返回,或者将其替换成另一个函数或可调用对象。
严格的说,装饰器只是语法糖。装饰器可以像常规的可调用对象那样调用,其参数是另一个函数。
装饰的两大特性:1.能把被装饰的函数替换成其他函数。2.装饰器在加载模块时立即执行。
# BEGIN REGISTRATION
registry = [] # <1>
def register(func): # <2>
print('running register(%s)' % func) # <3>
registry.append(func) # <4>
return func # <5>
@register # <6>
def f1():
print('running f1()')
@register
def f2():
print('running f2()')
def f3(): # <7>
print('running f3()')
def main(): # <8>
print('running main()')
print('registry ->', registry)
f1()
f2()
f3()
if __name__=='__main__':
main() # <9>
# END REGISTRATION
running register(<function f1 at 0x00000000024D8EA0>)
running register(<function f2 at 0x00000000024FD268>)
running main()
registry -> [<function f1 at 0x00000000024D8EA0>, <function f2 at 0x00000000024FD268>]
running f1()
running f2()
running f3()
前两行,在导入装饰器时已执行。