裝飾器入門(1)
接下來的話題:
如果裝飾器需要帶參數(shù)應(yīng)該怎么做花履?
@log('execute')
要給log函數(shù)傳入一個參數(shù)(這里是字符串)
def log(text):
def decorator(func):
# 保持函數(shù)本身簽名等資源不變
@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()
這樣就可以更自由地自定義參數(shù)了多艇,
比如這樣能通過參數(shù)標(biāo)識定位到執(zhí)行函數(shù)去团。
根據(jù)廖雪峰的裝飾器一章掠拳,有道課后習(xí)題血巍,如何實現(xiàn)@log, @log('execute')同時調(diào)用的情況
這里我簡單地實現(xiàn)了一下萧落,還不是很完善。
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