编写decorator:
首先编写decorator函数,以@log为例:
def log(f): def fn(x): print 'call ' + f.__name__ + '()...' return f(x) return fn
在这里,log函数中定义了一个fn函数,fn中打印了log并返回f,log函数返回fn。注意,这里的f.__name__是调用了函数的名字
调用的时候:
@log def factorial(n): return reduce(lambda x,y: x*y, range(1, n+1)) print factorial(10)
这里的@log与 factorial=log(factorial)等效,意味着,原有的factorial被覆盖掉了。
结果:
call factorial()... 3628800
要让 @log 自适应任何参数定义的函数,可以利用Python的 *args 和 **kw,保证任意个数的参数总是能正常调用:
def log(f): def fn(*args, **kw): print 'call ' + f.__name__ + '()...' return f(*args, **kw) return fn
这样不管f中的参数是什么样子的,都可以这样调用了。