定义:在代码运行期间动态增加功能的方式

decorator:返回函数的高阶函数

def log(func):
    def wrapper(*args, **kw):
        print('call %s():' %func.__name__)
        return func(*args, **kw)
    return wrapper

显然,log函数接受一个函数为参数,并返回一个函数
那么在一个函数上面加上@log

@log 
def now():
    print('1-1-1')
>>>now()
call now():
1-1-1

把@log放到now()定义处相当于执行

now = log(now)

于是新的now()将执行新函数,即log中返回的wrapper()函数
因此执行时首先打印日志,然后执行之前的now()

如果decorator需要传入参数,则需要编写一个返回decorator的高阶函数,例如

def log(text):
    def decorator(func):
        def wrapper(*args, **kw):
            print('%s %s():' %(text, func.__name__))
            return func(*args, **kw)
        return wrapper
    return decorator

此时再执行

@log('execute')
def now():
    print('1-1-1')
>>>now()
execute now():
1-1-1

此时执行的是

now = log('execute')(now)

首先执行log('execute'),返回的是decorator函数,再调用返回的函数,参数是now函数,返回值最终是wrapper函数。

···待完善