剛開始接觸裝飾器這個概念
在我的概念里面, 裝飾器就是在函數(shù)外面再包了一層的語法糖, 可以在函數(shù)的執(zhí)行前和執(zhí)行后的部分添加功能,
比如 我要在函數(shù)前后,打開/關閉數(shù)據(jù)庫的連接, 寫入日志, 預處理等等,
這時候使用裝飾器可以簡化代碼量,提高復用效率,
看一個簡單的裝飾器:
import logging
def log(func):
def wrapper(*args, **kw):
logging.warning("調(diào)用函數(shù)前")
func(*args, **kw)
logging.warning("調(diào)用函數(shù)后")
return wrapper
@log
def now():
print ('2017/6/26')
return ('return result')
now()
輸出:
WARNING:root:調(diào)用函數(shù)前
2017/6/26
WARNING:root:調(diào)用函數(shù)后
這個裝飾器就是一個以函數(shù)為參數(shù)的函數(shù)而已。
這時候now() 就相當于 log(now)()。
這就是最簡單的在函數(shù)調(diào)用前后 輸出日志。
如果想要獲取函數(shù)返回結(jié)果怎么辦?
只需要簡單地修改wrapper函數(shù)
def log(func):
def wrapper(*args, **kw):
logging.warning("調(diào)用函數(shù)前")
t = func(*args, **kw)
logging.warning("調(diào)用函數(shù)后")
return t
return wrapper
print(now())
輸出:
2017/6/26
return result
WARNING:root:調(diào)用函數(shù)前
WARNING:root:調(diào)用函數(shù)后