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

? ? ????簡(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ò)誤。使用@裝飾器名 的語法糖可以解決這一問題。

? ? ????@裝飾器名語法糖:可以解決簡(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ù)的裝飾器。

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

? ? ? ? 除了函數(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ù)制到裝飾器中。

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