编写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中的参数是什么样子的,都可以这样调用了。