zoukankan      html  css  js  c++  java
  • Python何时执行装饰器

    装饰器的一个关键特性是,它们在被装饰的函数定义之后立即运行。这 通常是在导入时(即 Python 加载模块时),如示例 7-2 中的 registration.py 模块所示。
      示例 7-2 registration.py 模块
    registry = []
    
    def register(func):
        print('running register(%s)' % func)
        registry.append(func)
        return func
    
    @register
    def f1():
        print('running f1()')
    
    @register
    def f2():
        print('running f2()')
    
    def f3():
        print('running f3()')
    
    def main():
        print('running main()')
        print('registry ->', registry)
        f1()
        f2()
        f3()
    
    if __name__ == '__main__':
        main()

    运行结果

    running register(<function f1 at 0x0000027913AA8708>)
    running register(<function f2 at 0x0000027913AA8E58>)
    running main()
    registry -> [<function f1 at 0x0000027913AA8708>, <function f2 at 0x0000027913AA8E58>]
    running f1()
    running f2()
    running f3()
    注意,register 在模块中其他函数之前运行(两次)。调用 register 时,传给它的参数是被装饰的函数,例如 0x100631bf8>。
    加载模块后,registry 中有两个被装饰函数的引用:f1 和 f2。这两 个函数,以及 f3,只在 main 明确调用它们时才执行。
    如果导入 registration.py 模块(不作为脚本运行),输出如下:
    >>> import registration
    running register(<function f1 at 0x10063b1e0>)
    running register(<function f2 at 0x10063b268>)
    此时查看 registry 的值,得到的输出如下:
    >>> registration.registry
    [<function f1 at 0x10063b1e0>, <function f2 at 0x10063b268>]
    示例 7-2 主要想强调,函数装饰器在导入模块时立即执行,而被装饰的 函数只在明确调用时运行。这突出了 Python 程序员所说的导入时和运 行时之间的区别。
    考虑到装饰器在真实代码中的常用方式,示例 7-2 有两个不寻常的地 方。
      装饰器函数与被装饰的函数在同一个模块中定义。实际情况是,装 饰器通常在一个模块中定义,然后应用到其他模块中的函数上。
      register 装饰器返回的函数与通过参数传入的相同。实际上,大 多数装饰器会在内部定义一个函数,然后将其返回。
    虽然示例 7-2 中的 register 装饰器原封不动地返回被装饰的函数,但 是这种技术并非没有用处。很多 Python Web 框架使用这样的装饰器把函 数添加到某种中央注册处,例如把 URL模式映射到生成 HTTP 响应的函 数上的注册处。这种注册装饰器可能会也可能不会修改被装饰的函数。
    人生就是要不断折腾
  • 相关阅读:
    Educational Codeforces Round 64 (Rated for Div. 2)题解
    Codeforces Round #555 (Div. 3) F. Maximum Balanced Circle
    莫队算法总结
    cobalt strike使用笔记
    CMD命令行下载文件
    CTF线下赛AWD模式下的生存技巧
    python中multiprocessing模块
    密码重置
    python中的argparse模块
    python中BeautifulSoup模块
  • 原文地址:https://www.cnblogs.com/xiangxiaolin/p/11655741.html
Copyright © 2011-2022 走看看