装饰器

2018-06-17  本文已影响0人  小白快加油
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()
上一篇 下一篇

猜你喜欢

热点阅读