裝飾器(decorator)是一種高級Python語法??梢詫σ粋€函數(shù)、方法或者類進(jìn)行加工。
在Python中,我們有多種方法對函數(shù)和類進(jìn)行加工,相對于其它方式,裝飾器語法簡單,代碼可讀性高。因此,裝飾器在Python項目中有廣泛的應(yīng)用。修飾器經(jīng)常被用于有切面需求的場景,較為經(jīng)典的有插入日志、性能測試、事務(wù)處理,Web權(quán)限校驗,Cache等。
裝飾器的優(yōu)點是能夠抽離出大量函數(shù)中與函數(shù)功能本身無關(guān)的雷同代碼并繼續(xù)重用。即,可以將函數(shù)“修飾”為完全不同的行為,可以有效的將業(yè)務(wù)邏輯正交分解。概括的講,裝飾器的作用就是為已經(jīng)存在的對象添加額外的功能。
例如記錄日志,需要對某些函數(shù)進(jìn)行記錄。笨的辦法,每個函數(shù)加入代碼,如果代碼變了,就悲催了。裝飾器的辦法,定義一個專門日志記錄的裝飾器,對需要的函數(shù)進(jìn)行裝飾。
Python的Decorator在使用上和Java/C#的Annotation很相似,都是在方法名前面加一個@XXX注解來為這個方法裝飾一些東西。但是,Java/C#的Annotation也很讓人望而卻步,在使用它之前你需要了解一堆Annotation的類庫文檔,讓人感覺就是在學(xué)另外一門語言。
而Python使用了一種相對于DecoratorPattern和Annotation來說非常優(yōu)雅的方法,這種方法不需要你去掌握什么復(fù)雜的OO模型或是Annotation的各種類庫規(guī)定,完全就是語言層面的玩法:一種函數(shù)式編程的技巧。
裝飾器總結(jié)
裝飾器的核心作用是namebinding。這種語法是Python多編程范式的又一個體現(xiàn)。大部分Python用戶都不怎么需要定義裝飾器,但有可能會使用裝飾器。鑒于裝飾器在Python項目中的廣泛使用,了解這一語法是非常有益的。
常見錯誤:“裝飾器”=“裝飾器模式”
設(shè)計模式是一個在計算機(jī)世界里鼎鼎大名的詞。假如你是一名Java程序員,而你一點設(shè)計模式都不懂,那么我打賭你找工作的面試過程一定會度過的相當(dāng)艱難。
但寫Python時,我們極少談起“設(shè)計模式”。雖然Python也是一門支持面向?qū)ο蟮木幊陶Z言,但它的鴨子類型設(shè)計以及出色的動態(tài)特性決定了,大部分設(shè)計模式對我們來說并不是必需品。所以,很多Python程序員在工作很長一段時間后,可能并沒有真正應(yīng)用過幾種設(shè)計模式。
不過裝飾器模式(DecoratorPattern)是個例外。因為Python的“裝飾器”和“裝飾器模式”有著一模一樣的名字,我不止一次聽到有人把它們倆當(dāng)成一回事,認(rèn)為使用“裝飾器”就是在實踐“裝飾器模式”。但事實上,它們是兩個完全不同的東西。
“裝飾器模式”是一個完全基于“面向?qū)ο蟆毖苌龅木幊淌址āK鼡碛袔讉€關(guān)鍵組成:一個統(tǒng)一的接口定義、若干個遵循該接口的類、類與類之間一層一層的包裝。
最終由它們共同形成一種“裝飾”的效果。
而Python里的“裝飾器”和“面向?qū)ο蟆睕]有任何直接聯(lián)系,**它完全可以只是發(fā)生在函數(shù)和函數(shù)間的把戲。事實上,“裝飾器”并沒有提供某種無法替代的功能,它僅僅就是一顆“語法糖”而已。
以上內(nèi)容為大家介紹了如何理解Python裝飾器?希望對大家有所幫助,如果想要了解更多Python相關(guān)知識,請關(guān)注IT培訓(xùn)機(jī)構(gòu):千鋒教育。http://m.2667701.com/