這篇文章主要講解了“如何解決使用Python裝飾器出現(xiàn)的問題”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“如何解決使用Python裝飾器出現(xiàn)的問題”吧!

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、成都微信小程序、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了連山免費建站歡迎大家使用!
疑問
首先我有一個這樣的裝飾器文件路徑helper/log_helper.py
import traceback from functools import wraps from loguru import logger def my_logger(count): def step1(foo): @wraps(foo) def step2(*args, **kwargs): try: result = foo(*args, **kwargs) logger.info(f"{result=},{count=}") except Exception: logger.exception(traceback.format_exc()) return step2 return step1然后我有個文件需要引用這個裝飾器demo.py
from helper.log_helper import my_logger class Demo: @my_logger(count=2) def main(self): return "in main function" if __name__ == '__main__': d = Demo() d.main()
輸出結(jié)果如下
2020-10-16 11:43:12.001 | INFO | helper.log_helper:step2:18 - result='in main function',count=2
這個裝飾器的作用很簡單,就是獲取當(dāng)前函數(shù)的返回值,和傳入的count值。
好,現(xiàn)在問題來了?
如果給裝飾器的參數(shù)傳值呢,也就是說我的count=2,是通過傳值的形式。你想到可能是這樣
from helper.log_helper import my_logger COUNT=2 class Demo: @my_logger(count=COUNT) def main(self): return "in main function" if __name__ == '__main__': d = Demo() d.main()
ok,這樣確實可以,我們還可以使用再簡化一步
from functools import partial from helper.log_helper import my_logger COUNT=2 my_logger = partial(my_logger,count=2) class Demo: @my_logger() def main(self): return "in main function" if __name__ == '__main__': d = Demo() d.main()
暫時來看我們搞定了傳參數(shù)的問題,這時候我們想如果外界調(diào)用了Demo類的main方法,并且向指定count的值怎么辦呢?
我們知道外界調(diào)用Demo類傳參的唯一途徑就是向__init__里進(jìn)行傳參數(shù),按照這個思路我們只能這么寫了,
class Demo: def __init__(self): count =2 @my_logger(count=self.count) def main(self): return "in main function"
但是這樣并不可以,我們得到錯誤信息
NameError: name 'self' is not defined
在裝飾器中無法使用self.形式的參數(shù),難道這個問題解決不了么?
問題解決
在Python3.7之前確實沒什么可行的方案。
我們知道在Python3.7的時候引入了dataclasses,我們可以通過它來簡化__init__。
改下我們的代碼
from functools import partial from helper.log_helper import my_logger from dataclasses import dataclass @dataclass() class Demo: count: int = 2 logger: my_logger = partial(my_logger, count) @logger() def main(self): return "in main function" if __name__ == '__main__': d = Demo() d.main()
如果使用Python3.8那么可以直接忽略掉dataclass
class Demo: count: int = 2 logger: my_logger = partial(my_logger, count) @logger() def main(self): return "in main function"
感謝各位的閱讀,以上就是“如何解決使用Python裝飾器出現(xiàn)的問題”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對如何解決使用Python裝飾器出現(xiàn)的問題這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!
網(wǎng)站欄目:如何解決使用Python裝飾器出現(xiàn)的問題
本文路徑:http://chinadenli.net/article12/pgjcdc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、品牌網(wǎng)站建設(shè)、網(wǎng)站改版、網(wǎng)頁設(shè)計公司、用戶體驗、企業(yè)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)