要增强now()函数的功能,比如,在函数调用前后自动打印日志,但又不希望修改now()函数的定义,这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。
demo1,不带参数的装饰器
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 '2013-12-25'
执行
>>> now() call now(): 2013-12-25 相当于执行: now = log(now)
demo2,带参数的装饰器
def log(text): def decorator(func):
@functools.wraps(func) def wrapper(*args, **kw): print '%s %s():' % (text, func.__name__) return func(*args, **kw) return wrapper return decorator @log('execute') def now(): print '2013-12-25'
执行
>>> now() execute now(): 2013-12-25 >>> now = log('execute')(now)
@functools.wraps(func)的作用,f=now() 将的__name__ 由wrapper改回now