在代码运行期间动态增加函数功能的方式,称之为“装饰器”(Decorator)。
def log(func): def wrapper(*args, **kw): print 'call %s():' % func.__name__ return func(*args, **kw) return wrapper @log def now(): print '2013-12-25'
def log(text): #带参数版装饰器 def decorator(func): def wrapper(*args, **kw): print '%s %s():' % (text, func.__name__) return func(*args, **kw) return wrapper return decorator
完整版
import functools def log(func): @functools.wraps(func) def wrapper(*args, **kw): print 'call %s():' % func.__name__ return func(*args, **kw) return wrapper
#functools的作用:把原始函数的__name__
等属性复制到wrapper()
函数中
也可以给一个函数添加多个装饰器
def memorize(f): cache = {} def helper(x): if x not in cache: cache[x] = f(x) return cache[x] return helper def trace(f): def helper(x): call_str = "{0}({1})".format(f.__name__, x) print("Calling %s..." % call_str) result = f(x) print("...returning from %s = %s" % (call_str, result)) return result return helper @memorize @trace def fib(n): if n in (0,1): return 1 else: return fib(n-2)+fib(n-1) fib(5)