registry = [] # 注册处 #registry保存被@register装饰的函数引用
def register(func): # 寄存器 #register的参数是一个函数
print('running register(%s)' % func) #为了演示,显示被装饰的函数
registry.append(func) #把func存入registry
return func #返回func:必须返回函数;这里返回的函数与通过参数传入的一样0
@register #f1和f2被@register装饰
def f1():
print('running f1()')
@register
def f2():
print('running f2()')
def f3(): #f3没有装饰
print('running f3()')
def main(): #main显示registry,然后调用f1(),f2(),f3()
print('running main()')
print('registry ->', registry)
f1()
f2()
f3()
if __name__ == '__main__':
main() #只有把registration.py当做脚本运行得到的输出如下
这里主要想强调,函数装饰器在导入模块时立即执行,
而被装饰的函数只在明确调用时运行。
这突出了Python程序员所说的导入时和运行时之间的区别
把registration.py当做脚本运行得到的输出是
running register(<function f1 at 0x0000000002825A60>)
running register(<function f2 at 0x0000000002825AE8>)
running main()
registry -> [<function f1 at 0x0000000002825A60>, <function f2 at 0x0000000002825AE8>]
running f1()
running f2()
running f3()