Python 在語法上除了冒號與強制縮進外其實也沒有太多令人眼前一亮的東西,倒是它的裝飾器(Decorator) 值得玩味。初讀 《THE Quick Python Book》一書,關於 Decorator(裝飾器) 這一節匆匆而過,只是覺得它像 Java 註解一樣的東西,沒太細究。後來慢慢看到還是不少地方在用裝飾器,如 Python 的屬性 @property
, @name_attr.setter
, 還有 Flask 中用於定義路由的 @app.route('/')
等。
因此還是有必要花些功夫去更深入的瞭解 Python 的裝飾器,從目前對裝飾器的理解,它兼具 Java 的註解與代理的功能,而且比 Java 中自定義註解的處理與動態代理的實現要簡單的多,甚至不需要特別牽涉到到面向方面的編程這麼一個專門的概念。Python 的裝飾器並非指的設計模式中的裝飾器模式,Python 的裝飾器主要還是關於代理,或叫方法攔截,切面的。
裝飾器簡單說來就是一個高階函數,即一個函數作爲另一個函數的參數,比如說函數 A 作爲函數 B 的參數,然後函數 B 的實現有能力決定實際調用 A 的前後作點手腳,甚至壓根不調用 A。由此,裝飾器完全可以實現面向方面的 @Before, @After, @Around, @AfterReturning, @AfterThrowing 所有語義。
Python 中的函數像 JavaScript 的一樣是頭等對象(first-class objects),所以函數本身可以作爲參數任意傳遞,一個函數也可以返回另一個函數。Python 的函數中還允許用相同的 def fun():...
語法定義內部函數。 閱讀全文 >>