1. 装饰器概述
本文不涉及类装饰器。
装饰器是一个函数。
通常将函数作为参数传递给装饰器函数。
装饰器函数通常包含了一个闭包。闭包是函数内部一个函数,在函数内部增加了一个变量局部作用域。通常,装饰器会修改被装饰的函数。
2. 代码解释
2.1 函数装饰器用法简述
装饰器在紧挨着定义一个函数的 def 语句之前一行编写,它由@符号以及紧随其后的对于元函数的一个引用组成。假如有个名为 decorate 的装饰器
@decorate def target(): print('running target()')
上述代码等价于如下代码:
def target(): print('running target()') target = decorate(target)
2.2 装饰器通常把被装饰的函数替换为另外一个函数
让一个函数作为装饰器的关键是其将一个函数作为参数传递给它
>>> def f1(f): def f2(): print('这是闭包') return f2 >>> def f3(): print('被装饰函数') >>> f3() 被装饰函数 >>> f3 <function f3 at 0x02375588> >>> @f1 # 装饰器会将函数f3替换成函数f2 def f3(): print('被装饰函数') >>> f3() 这是闭包 >>> f3 # 下面这句:f3是f1局部作用域里面函数f2的引用(.号) <function f1.<locals>.f2 at 0x023B6DB0>
2.3 装饰器不修改被装饰函数的情况
注册函数(待续)......
2.4 装饰器在加载模块时立即执行
如果将一个程序作为模块导入另外一个程序(不作为脚本运行),则装饰器将在模块导入时立即运行,详细见《流畅的Python》第七章7.2节。