装饰器
顾名思义就是用来修饰一般函数的,因此它通常放在函数前。
@log
def now():
print('2015-3-25')
log这个装饰器的定义为:
def log(func):
def wrapper(*args, **kw):
print('call %s():' % func.__name__)
return func(*args, **kw)
return wrapper
log可以接受一个参数。
这样在函数前面加@log 就相当于执行了
now=log(now)
如果装饰器本身需要参数,可以这么做
def log(text):
def decorator(func):
def wrapper(*args, **kw):
print('%s %s():' % (text, func.__name__))
return func(*args, **kw)
return wrapper
return decorator
调用
@log('execute')
def now():
print('2015-3-25')
但这样还有一个问题,就是now(){外函数\实际使用的函数}的名字会变成wrapper.因此需要把原来的函数名给它,可以这么做:
import functools
def log(func):
@functools.wraps(func)
def wrapper(*args, **kw):
print('call %s():' % func.__name__)
return func(*args, **kw)
return wrapper
functools.wraps就是专门干这个的。