定义:在代码运行期间动态增加功能的方式
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函数。
···待完善