Python-19-類裝飾器

接上節內容,我們繼續介紹類裝飾器,顧名思義類裝飾器就是類閉包。

Python-19-類裝飾器

定義一個類裝飾器

需求:實現一個類裝飾器,能夠在方法執行時列印日誌,並且傳送通知到指定地方。

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

點選↓↓↓