裝飾器

? ??? ??裝飾器的作用是,對(duì)于有切面需求的場(chǎng)景,例如:調(diào)用函數(shù)的日志等,采用其他方式顯得繁瑣。而使用裝飾器可以美觀有快捷的實(shí)現(xiàn)代碼復(fù)用。以下是對(duì)裝飾器關(guān)鍵部分的筆記。來源:www.zhihu.com/question/26930016


圖1 簡(jiǎn)單裝飾器

? ? ????簡(jiǎn)單裝飾器:就是將函數(shù)作為參數(shù)放到裝飾器函數(shù)中。裝飾器函數(shù)返回的是個(gè)wrapper函數(shù),這個(gè)函數(shù)內(nèi)執(zhí)行了作為參數(shù)的函數(shù)的操作以及其他一些跟這個(gè)函數(shù)屬性相關(guān)聯(lián)的操作。本例中,bar函數(shù)作為參數(shù)傳入use_logging函數(shù),然后返回wrapper函數(shù)賦值給bar,在調(diào)用bar時(shí),實(shí)際上調(diào)用的是wrapper函數(shù)。簡(jiǎn)單裝飾器的一個(gè)問題是:在使用時(shí),需要有語句:bar=use_logging(bar),繁瑣不美觀且容易引起錯(cuò)誤。使用@裝飾器名 的語法糖可以解決這一問題。


圖2 @裝飾器名 語法糖

? ? ????@裝飾器名語法糖:可以解決簡(jiǎn)單裝飾器帶來的每次調(diào)用前要使用bar=sue_logging(bar)引起的混亂繁瑣不美觀。其與簡(jiǎn)單裝飾器在語法上的不同只在于函數(shù)前加一行@裝飾器名語法糖。

? ? ? ? 現(xiàn)在假設(shè),有一個(gè)標(biāo)志位,只在這個(gè)標(biāo)志位為1時(shí)對(duì)函數(shù)調(diào)用進(jìn)行記錄。上述裝飾器不能實(shí)現(xiàn)這個(gè)功能,可以使用帶參數(shù)的裝飾器。


圖3 帶參數(shù)的裝飾器

? ? ????這種裝飾器的運(yùn)行邏輯是,將參數(shù)傳入到decorator中,再把函數(shù)傳入,在wrapper中執(zhí)行操作。在使用時(shí),只需要在定義函數(shù)前加帶參數(shù)的語法糖即可。調(diào)用直接使用參數(shù)名。


圖4 類裝飾器

? ? ? ? 除了函數(shù)裝飾器外,還有類裝飾器,這種裝飾器具有靈活度大、高內(nèi)聚、封裝性等優(yōu)點(diǎn)。在構(gòu)造函數(shù)中,將要執(zhí)行的函數(shù)賦值給裝飾器,如果是帶參數(shù)的裝飾器,同樣可以在構(gòu)造函數(shù)中賦值。在使用是,@語法糖將定義的函數(shù)名傳入構(gòu)造函數(shù)中,調(diào)用時(shí)只需要調(diào)用函數(shù)名即可。

? ? ? ? 以上裝飾器雖然帶來了減少重復(fù)代碼的好處,但是,導(dǎo)致了原始函數(shù)的信息丟失??梢允褂胒unctools模塊的wraps進(jìn)行裝飾。wraps同樣是一個(gè)裝飾器,實(shí)現(xiàn)的就是將原來函數(shù)的信息復(fù)制到裝飾器中。


圖5 functools.wraps裝飾器

? ? 對(duì)于多個(gè)裝飾器,先用內(nèi)層的裝飾,再用外層的進(jìn)行裝飾。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 每個(gè)人都有的內(nèi)褲主要功能是用來遮羞,但是到了冬天它沒法為我們防風(fēng)御寒,咋辦?我們想到的一個(gè)辦法就是把內(nèi)褲改造一下,...
    chen_000閱讀 1,403評(píng)論 0 3
  • **裝飾器是一個(gè)很著名的設(shè)計(jì)模式,經(jīng)常被用于有切面需求的場(chǎng)景,較為經(jīng)典的有插入日志、性能測(cè)試、事務(wù)處理等。裝飾器是...
    牛崽兒酷閱讀 349評(píng)論 0 0
  • 裝飾器 裝飾器本質(zhì)上是一個(gè)Python函數(shù),它可以讓其他函數(shù)在不需要做任何代碼變動(dòng)的前提下增加額外功能,裝飾器的返...
    時(shí)間之友閱讀 2,437評(píng)論 0 3
  • 本文為《爬著學(xué)Python》系列第四篇文章。從本篇開始,本專欄在順序更新的基礎(chǔ)上,會(huì)有不規(guī)則的更新。 在Pytho...
    SyPy閱讀 2,570評(píng)論 4 11
  • 沒有一件事值得你放棄自我感知,因?yàn)樗钪苯涌煽俊?所有的經(jīng)驗(yàn)都來源于你的已知,當(dāng)下的經(jīng)驗(yàn)還沒經(jīng)過你,若是想得知正在...
    殷艷春閱讀 274評(píng)論 0 1

友情鏈接更多精彩內(nèi)容