欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

如何解決使用Python裝飾器出現(xiàn)的問題

這篇文章主要講解了“如何解決使用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)

外貿(mào)網(wǎng)站建設(shè)