<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Python裝飾器

          共 2416字,需瀏覽 5分鐘

           ·

          2022-08-01 02:08

          點(diǎn)擊上方小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂

          重磅干貨,第一時(shí)間送達(dá)

          所謂裝飾器(decorator)指的是在Python代碼運(yùn)行期間動(dòng)態(tài)的增加函數(shù)功能的一種方式。在上一節(jié)我們知道Python函數(shù)在運(yùn)行時(shí)允許返回函數(shù),而函數(shù)作為對(duì)象也可以被賦值給其他變量來調(diào)用,比如:

          >>> def LAL():
          ...    print('kobe')
          ...
          >>> f = LAL
          >>> f()
          kobe

          每個(gè)函數(shù)對(duì)象都有一個(gè)_ _name_ _屬性,調(diào)用該屬性我們可以取得該函數(shù)的名稱:

          >>> LAL.__name__
          'LAL'
          >>> f.__name__
          'LAL'

          而裝飾器(decorator)的作用即在于可以使得我們?cè)谡{(diào)用 LAL 函數(shù)的時(shí)候,使得該函數(shù)功能增強(qiáng),比如說在調(diào)用該函數(shù)前后自動(dòng)打印日志,但又不能改變 LAL函數(shù)的定義。所以,Python裝飾器的本質(zhì)在于它是一個(gè)可以返回函數(shù)的高階函數(shù)。我們來定義一個(gè)decorator,使得函數(shù)在調(diào)用前后能打印日志。

          def log(func):
          def folder(*args,**kw):
          print('call %s():' % func.__name__)
          return func(*args,**kw)
          return folder

          仔細(xì)觀察上述代碼,我們定義的log函數(shù)作為一個(gè)decorator可以接受像func這樣的函數(shù)作為參數(shù),作為高階函數(shù)它也可以返回一個(gè)函數(shù)。下面再利用Python的@語法,在重新定義 LAL函數(shù)時(shí)調(diào)用裝飾器:

          @log
          def LAL():
          print('kobe')

          之后再調(diào)用 LAL 函數(shù)時(shí),不僅會(huì)運(yùn)行 LAL 函數(shù)本身也會(huì)打印裝飾器所設(shè)置的一串日志。

          >>> LAL()
          call LAL():
          kobe

          @語法的作用相當(dāng)于執(zhí)行了如下語句:

          LAL = log(LAL)

          如果decorator本身也需要傳入?yún)?shù),那裝飾器的定義則需要更加復(fù)雜一點(diǎn)。我們可以自定義log的文本:

          def log(text):
          def decorator(func):
          def folder(*args,**kw):
          print('call %s():' % (text,func.__name__))
          return func(*args,**kw)
          return folder
          return decorator

          可以看見的是,我們經(jīng)過三層嵌套后使得裝飾器本身可以傳入文本參數(shù),其用法如下:

          @log('execute')
          def LAL():
          print('kobe')

          函數(shù)執(zhí)行結(jié)果如下:

          >>> LAL()
          execute LAL():
          kobe

          相較于兩層嵌套,三層嵌套的decorator相當(dāng)于執(zhí)行了如下語句:

          >>> LAL = log('execute')(LAL)

          可以簡單分析一下這個(gè)語句。先執(zhí)行l(wèi)og('execute'),返回的是裝飾器函數(shù),調(diào)用該返回函數(shù),其參數(shù)是LAL函數(shù),最后的返回值則是folder函數(shù)。不管兩層還是三層嵌套,decorator的定義都是這種套路,我們開頭時(shí)提到了函數(shù)作為對(duì)象是有__name__屬性的,但經(jīng)過裝飾器裝飾后的函數(shù),其__name__屬性由原先的'LAL'變成了'folder':

          >>> LAL.__name__
          'folder'

          所以這里我們還需要導(dǎo)入functools模塊,使用functools.wraps使得經(jīng)裝飾器裝飾前后的函數(shù)對(duì)象名保持不變,完整的decorator定義方法如下:

          import functools

          def log(func):
          @functools.wraps(func)
          def folder(*args,**kw):
          print('call %s():' % func.__name__)
          return func(*args,**kw)
          return folder

          decorator可以增強(qiáng)函數(shù)的功能,雖然不容易定義清楚,但使用起來非常便利。

          好消息!

          小白學(xué)視覺知識(shí)星球

          開始面向外開放啦??????




          下載1:OpenCV-Contrib擴(kuò)展模塊中文版教程
          在「小白學(xué)視覺」公眾號(hào)后臺(tái)回復(fù):擴(kuò)展模塊中文教程即可下載全網(wǎng)第一份OpenCV擴(kuò)展模塊教程中文版,涵蓋擴(kuò)展模塊安裝、SFM算法、立體視覺、目標(biāo)跟蹤、生物視覺、超分辨率處理等二十多章內(nèi)容。

          下載2:Python視覺實(shí)戰(zhàn)項(xiàng)目52講
          小白學(xué)視覺公眾號(hào)后臺(tái)回復(fù):Python視覺實(shí)戰(zhàn)項(xiàng)目即可下載包括圖像分割、口罩檢測(cè)、車道線檢測(cè)、車輛計(jì)數(shù)、添加眼線、車牌識(shí)別、字符識(shí)別、情緒檢測(cè)、文本內(nèi)容提取、面部識(shí)別等31個(gè)視覺實(shí)戰(zhàn)項(xiàng)目,助力快速學(xué)校計(jì)算機(jī)視覺。

          下載3:OpenCV實(shí)戰(zhàn)項(xiàng)目20講
          小白學(xué)視覺公眾號(hào)后臺(tái)回復(fù):OpenCV實(shí)戰(zhàn)項(xiàng)目20講即可下載含有20個(gè)基于OpenCV實(shí)現(xiàn)20個(gè)實(shí)戰(zhàn)項(xiàng)目,實(shí)現(xiàn)OpenCV學(xué)習(xí)進(jìn)階。

          交流群


          歡迎加入公眾號(hào)讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器自動(dòng)駕駛、計(jì)算攝影、檢測(cè)、分割、識(shí)別、醫(yī)學(xué)影像、GAN算法競(jìng)賽等微信群(以后會(huì)逐漸細(xì)分),請(qǐng)掃描下面微信號(hào)加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺SLAM“。請(qǐng)按照格式備注,否則不予通過。添加成功后會(huì)根據(jù)研究方向邀請(qǐng)進(jìn)入相關(guān)微信群。請(qǐng)勿在群內(nèi)發(fā)送廣告,否則會(huì)請(qǐng)出群,謝謝理解~



          瀏覽 32
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产欧美精品 | 亚洲日本色情视频在线 | 色哟哟精品无码 | 狠狠躁日日躁XXXXAAAA | 人人操人人操人人操人人操人人操 |