装饰器基础知识
装饰器是可调用的对象,其参数是另一函数(被装饰的函数),装饰器可能会处理被装饰的函数,然后把它返回,或者将其替换成另一个函数或可调用对象。
假如有个名为 decorate 的装饰器:
@decorate def target(): print('running target()')
上述代码的效果与下述写法一样:
def target(): print('running target()') target = decorate(target)
两种写法的最终结果一样:上述两个代码片段执行完毕后得到的 target 不一定是原来那个 target 函数,而是 decorate(target) 返 回的函数。
为了确认被装饰的函数会被替换,请看示例 7-1 中的控制台会话。
示例 7-1 装饰器通常把函数替换成另一个函数
def deco(func): def inner(): print('running inner()') return inner @deco def target(): print('running target()') target() print(target)
严格来说,装饰器只是语法糖。如前所示,装饰器可以像常规的可调用 对象那样调用,其参数是另一个函数。有时,这样做更方便,尤其是做 元编程(在运行时改变程序的行为)时。
综上,装饰器的一大特性是,能把被装饰的函数替换成其他函数。第二 个特性是,装饰器在加载模块时立即执行。
人生就是要不断折腾