Python:函数装饰器

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节。

 

作者:南宫恨

正是江南好风景,落花时节又逢君

原文地址:https://www.cnblogs.com/ydkh/p/14680624.html