装饰器基础知识

装饰器是可调用的对象,其参数是另一函数(被装饰的函数),装饰器可能会处理被装饰的函数,然后把它返回,或者将其替换成另一个函数或可调用对象。

假如有个名为 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)
严格来说,装饰器只是语法糖。如前所示,装饰器可以像常规的可调用 对象那样调用,其参数是另一个函数。有时,这样做更方便,尤其是做 元编程(在运行时改变程序的行为)时。
综上,装饰器的一大特性是,能把被装饰的函数替换成其他函数。第二 个特性是,装饰器在加载模块时立即执行。
 
posted @ 2019-10-11 11:01  顽强的allin  阅读(141)  评论(0编辑  收藏  举报