装饰器

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()
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 装饰器基础知识 装饰器是可调用的对象,其参数是另一个函数(被装饰的函数)。装饰器可能会处理被装饰的函数,然后把它返...
    凹凸曼_ebb9阅读 681评论 1 1
  • 本文为《爬着学Python》系列第四篇文章。从本篇开始,本专栏在顺序更新的基础上,会有不规则的更新。 在Pytho...
    SyPy阅读 2,605评论 4 11
  • Python的装饰器的英文名叫Decorator,要对一个已有的模块做一些“修饰工作”,所谓修饰工作就是想给现有的...
    Spareribs阅读 762评论 1 11
  • 装饰器基础知识 两大特性:能把装饰的函数替换成另一个函数装饰器在加载模块时(导入时)立即执行,而被装饰的函数(普通...
    一块大番薯阅读 343评论 0 0
  • 装饰器模式 无论何时我们想对一个对象添加额外的功能,都有下面这些不同的可选方法。 如果合理,可以直接将功能添加到对...
    英武阅读 5,251评论 1 50

友情链接更多精彩内容