Python的裝飾器

裝飾器是什麼?如何入門

裝飾器都不陌生,是一個很著名的設計模式,經常被用於有切面需求的場景,較為經典的有插入日誌、性能測試、事務處理等。

飾器是解決這類問題的絕佳設計,我們就可以抽離出大量函數中與函數功能本身無關的雷同代碼並繼續重用。

概括的講,裝飾器的作用就是為已經存在的對象添加額外的功能。

需求是怎麼來的:

好好看看下面的的例子,做對比

函數在Python中是一等公民,那麼我們可以考慮重新定義一個函數timeit,將foo的引用傳遞給他,然後在timeit中調用foo並進行計時,這樣,我們就達到了不改動foo定義的目的

看起來邏輯上並沒有問題,一切都很美好並且運作正常!我們似乎修改了調用部分的代碼。原本我們是這樣調用的:foo(),變成了:timeit(foo)。如果foo在N處都被調用了,你就不得不去修改這N處的代碼。

Advertisements

減少改動

我們就來想想辦法不修改調用的代碼;如果不修改調用代碼,也就意味著調用foo()需要產生調用timeit(foo)的效果。我們可以想到將timeit賦值給foo,但是timeit似乎帶有一個參數。想辦法把參數統一吧!如果timeit(foo)不是直接產生調用效果,而是返回一個與foo參數列表一致的函數的話……就很好辦了,將timeit(foo)的返回值賦值給foo,然後,調用foo()的代碼完全不用修改

一個簡易的計時器就做好了!

我們只需要在定義foo以後調用foo之前,加上foo = timeit(foo),就可以達到計時的目的,這也就是裝飾器的概念,看起來像是foo被timeit裝飾。

與傳統編程習慣的從上往下執行方式相比較而言,像是在函數執行的流程中橫向地插入了一段邏輯。

Advertisements

這個例子僅用於演示,並沒有考慮foo帶有參數和有返回值的情況,完善它的重任就交給你了

各位同學注意啦!!

想獲取更多視頻或者有任何學習問題

歡迎加入Python交流群

626062078

Advertisements

你可能會喜歡