作者讲解装饰器时的一段代码:
def log(func):
def wrapper(*args, **kw):
print('call %s():' % func.__name__)
return func(*args, **kw)
return wrapper
@log
def now():
print('2015-3-25')
首先要注意的一点是,func.__name__中name前后各有两个横杠,否则会出现AttributeError: 'function' object has no attribute '_name_'
接下来作者说@log放到now函数定义处相当于执行:
now = log(now)
那么,我对这段代码的理解是:
- now函数的定义让一个名为now的变量指向了同名的函数对象。
- 执行log(now)即调用log函数,返回wrapper函数,由于wrapper是log的内函数且使用了log的临时变量func,那么在log结束时,wrapper会绑定func即now函数对象。
3.now变量指向返回的wrapper函数对象。
这也可以解释为什么此时执行
now.__name__
结果为‘wrapper’,因为now变量此时就指向wrapper函数对象,而wrapper函数对象绑定着最开始创建的now函数对象。