Python成長日記-初識裝飾器
裝飾器本質上是一個Python函數,它可以讓其他函數在不需要做任何代碼變動的前提下增加額外功能,裝飾器的返回值也是一個函數對象。
它常用於有切面需求的場景,比如:插入日誌、性能測試、事務處理、緩存、許可權校驗等場景。
裝飾器是解決這類問題的絕佳設計,有了裝飾器,我們就可以抽離出大量與函數功能本身無關的雷同代碼並繼續重用。
概括的講,裝飾器的作用就是為已經存在的對象添加額外的功能。
首先我們看一個簡單的例子:
我們實現了一個簡單的函數:
若此時,我們有了一個新的需求:列印hello並且列印日誌
那麼可能大家都會想到,我添加一行列印日誌的代碼不就行了嗎?
不難發現,我們可以實現
假如你有幾十個函數都需要添加日誌,那麼你就必須把每個日誌都找到,然後一行一行地添加代碼,這樣就會造成大量的重複代碼,我們會不會在不動原函數的前提下實現我們的功能?
開放封閉原則:
對擴展開放,意味著有新的需求或變化時,可以對現有代碼進行擴展,以適應新的情況。
對修改封閉,意味著類一旦設計完成,就可以獨立完成其工作,而不要對類進行任何修改。
這時可能有人想到了,我再創建個函數然後調用這個函數就可以實現,而且減少了代碼重複
相當於我們之前是使用info()函數實現列印,現在又要使用logger()函數實現,若是別人不知道logger這個函數,只知道有info這個函數,他只想調用info這個函數
dangdangdang~~裝飾器就要登場了
其實,python為我們提供了一個更簡單的方式,使用(@裝飾器函數)即可
但是裝飾器函數必須寫在你要使用的函數之前,否則就找不到你的裝飾器函數
擴展:若我們的函數是個帶參函數且有返回值,那麼我們裝飾器部分的形參可以使用*args和**kwargs
TAG:Python |