接上節內容,我們繼續介紹類裝飾器,顧名思義類裝飾器就是類閉包。
定義一個類裝飾器
需求:實現一個類裝飾器,能夠在方法執行時列印日誌,並且傳送通知到指定地方。
from functools import wrapsclass logAndNotify(object): # 初始化,定義日誌路徑 def __init__(self,logfile=‘service。log’): self。logfile = logfile # 使類成為可呼叫物件 def __call__(self,func): @wraps(func) def wrap_func(*args,**kwargs): info = func。__name__+‘was called’ # 實現寫日誌 with open(self。logfile,‘a’) as f: f。write(info+‘\n’) # 實現通知 self。notify() return func(*args,**kwargs) return wrap_func def notify(self): print(‘notify has been send。。。’)@logAndNotify()def sayHi(name): print(‘hello’,name,‘!’)res = sayHi(‘phyger’)print(res)
執行結果:
➜ RemoteWorking git:(master) ✗ /usr/bin/python3 /root/RemoteWorking/test/test。pynotify has been send。。。hello phyger !None
類裝飾器功能擴充套件
如果我們想要在此類裝飾器的基礎上,增加發送郵件的功能,就可以利用類的繼承特性來實現。
from functools import wrapsclass logAndNotify(object): # 初始化,定義日誌路徑 def __init__(self, logfile=“service。log”): self。logfile = logfile # 使類成為可呼叫物件 def __call__(self, func): @wraps(func) def wrap_func(*args, **kwargs): info = func。__name__ + “was called” # 實現寫日誌 with open(self。logfile, “a”) as f: f。write(info + “\n”) # 實現通知 self。notify() return func(*args, **kwargs) return wrap_func def notify(self): print(“notify has been send。。。”)class NewWarp(logAndNotify): # 初始化郵件地址 def __init__(self, email_address=‘phyger@qq。com’, *args, **kwargs): self。email_address = email_address super(NewWarp,self)。__init__(*args, **kwargs) # 重寫notify方法 def notify(self): print(“notify has been send。。。”) print(‘email sended。。。to’,self。email_address) @NewWarp()def sayHi(name): print(“hello”, name, “!”)res = sayHi(“phyger”)print(res)
執行結果:
➜ RemoteWorking git:(master) ✗ /usr/bin/python3 /root/RemoteWorking/test/test。pynotify has been send。。。email sended。。。to phyger@qq。comhello phyger !None
點選↓↓↓