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