先上代码
import functools
def log(func):
@functools.wraps(func)
def wrapper(*args, **kw):
print('call %s():' % func.__name__)
return func(*args, **kw)
return wrapper
@log
def now():
print("i'm working!")
分析:
理解闭包的概念
下cell中@log====相当于 now=log(now),now被赋值为wrapper,定义wrapper时用的func(now)是原来的func(now),因为闭包的原因。
闭包:定义wrapper时形成了闭包,log中的对象(func,wrapper)构成了一个整体环境。如下,log中,func被wrapper引用,log函数return后,func依旧被保存在了wrapper中。