python面向物件之函式裝飾器高階
阿新 • • 發佈:2018-12-19
函式裝飾器高階
-
最新版本
最新版本的python匯入了functools模組
from functools import wraps def debug(func): @wraps(func) def wrapper(name): print("[DEBUG]: enter {}()".format(func.__name__)) return func(name) #此處加上return return wrapper @debug def show(s): print(s) show('ppyth')
-
帶引數的裝飾器
from functools import wraps def debug(*text): def decorated(func): @wraps(func) def wrapper(name): print("[DEBUG]: enter {}()".format(func.__name__)) return func(name) # 此處加上return return wrapper return decorated @debug() #此處的()不可以刪略 def show(s): print(s) show('ppyth')
-
__call__()
所有的函式都是可呼叫物件。 一個類例項也可以變成一個可呼叫物件,只需要實現一個特殊方法__call__()
class Person(object): def __init__(self,name): self.name=name def __call__(self, *args, **kwargs): print('my name is ',self.name) print('my hobby is ',args) p1=Person('tom') p1('reading')
所以,在Python中,函式也是物件,物件和函式的區別並不顯著。
-
類裝飾器(待續…)
from functools import wraps from datetime import datetime #類的裝飾器寫法,日誌 class log(object): def __init__(self, logfile='out.log'): self.logfile = logfile def __call__(self, func): @wraps(func) def wrapped_func(*args, **kwargs): self.writeLog(*args, **kwargs) # 先呼叫 寫入日誌 return func(*args, **kwargs) # 正式呼叫主要處理函式 return wrapped_func #寫入日誌 def writeLog(self, *args, **kwargs): time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") log_str = time+' 操作人:{0[0]} 進行了【{0[1]}】操作'.format(args) with open(self.logfile, 'a',encoding='utf8') as file: file.write(log_str + '\n') @log() def myfunc(name,age): print('姓名:{0},年齡:{1}'.format(name,age)) if __name__ == '__main__': myfunc('小白', '查詢') myfunc('root', '新增人員') myfunc('小小', '修改資料')