foo = deco1(deco_arg)(deco2(foo)) 3.Python装饰器执行过程的手动分解
OK,有了上面的理论基础,理解下面一个较为复杂的装饰器就很容易了:
from functools import wraps
def log(text):
def decorator(func):
@wraps(func) #it works like:wraper.__name__ = func.__name__
def wrapper(*args, **kwargs):
print '%s %s():' % (text, func.__name__)
return func(*args, **kwargs)
return wrapper
return decorator
@log('Hello')
def now(area):
print area, '2016-01-23'
now('Beijing')
print 'The name of function now() is:', now.__name__
执行如下:
/usr/bin/python2.7 /home/xpleaf/PycharmProjects/decorator_test/dec10.py
Hello now():
Beijing 2016-01-23
The name of function now() is: now
对于该程序的执行过程,可以分析如下:
1.先执行log('Hello')函数,此时返回了一个新的函数,只不过其中的text变量被替换为'Hello',所以用来装饰now函数的新的装饰器如下:
def decorator(func):
@wraps(func) #it works like:wraper.__name__ = func.__name__