装饰器入门(1)
接下来的话题:
如果装饰器需要带参数应该怎么做?
@log('execute')
要给log函数传入一个参数(这里是字符串)
def log(text):
def decorator(func):
# 保持函数本身签名等资源不变
@functools.wraps(func)
def wrapper(*args,**kw):
print('begin call, %s %s():'%(text,func.__name__))
func(*args,**kw)
print('end call, %s %s()'%(text,func.__name__))
return wrapper
return decorator
@log('execute')
def now():
print ('2017/6/26')
now()
输出:
begin call, execute now():
2017/6/26
end call, execute now()
这样就可以更自由地自定义参数了,
比如这样能通过参数标识定位到执行函数。
根据廖雪峰的装饰器一章,有道课后习题,如何实现@log, @log('execute')同时调用的情况
这里我简单地实现了一下,还不是很完善。
def log(text):
if isinstance(text, None or str):
def decorator(func):
@functools.wraps(func)
def wrapper(*args,**kw):
print('begin call, %s %s():'%(text,func.__name__))
func(*args,**kw)
print('end call, %s %s()'%(text,func.__name__))
return wrapper
return decorator
else:
@functools.wraps(text)
def wrapper(*args, **kw):
print('begin call, %s():' % (text.__name__))
text(*args, **kw)
print('end call, %s()' % (text.__name__))
return wrapper