Python@TW: 會眾| IRC| Planet| 郵件列表| 聯絡我們
修訂版 9 和 10 的差異如下:
2007-05-21 22:43:04 修訂第 9 版
大小: 1466
編輯者: iap
說明:
2009-04-01 04:14:21 修訂第 10 版
大小: 1468
編輯者: localhost
說明: converted to 1.6 markup
這個顏色代表刪除的 這個顏色代表增加的
行號 42: 行號 42:
[http://wiki.python.org/moin/PythonDecoratorLibrary]; [[http://wiki.python.org/moin/PythonDecoratorLibrary]];
  • 題目:Python decorator
  • 初版貢獻者:
  • 其它貢獻者:
  • 日期:

Python 的 decorator 可以用來包裝其它的 function、method 與 lambda 等任何的 callable 物件。嚴格來說,decorator 並不是算是新發明,只是可以幫我們節省許多打字工作,以及讓程式碼更好看

Python decorator 的語法如下:

   1 @check_div_zero
   2 def div(a, b):
   3     return a / b

完全等效於:

   1 def div(a, b):
   2     return a / b
   3 div = check_div_zero(div)

check_div_zero 是一個 function 或者任何 callable,接受一個 callable 作為參數,並傳回另一個 callable。這樣做是為了包裝;將一些功能加到原本的 callable 上面。在上例中便是加入除以零的檢查動作 (check_div_zero):

   1 def check_div_zero(func):
   2     def deco(a, b):
   3         if a * b == 0:
   4             alert(".....")
   5             return
   6         func(a, b)
   7     return deco

這就是一個簡單的 decorator。程式員可以把一些會大量使用的檢查動作 (例如權限) 寫成 decorator,再包覆到會執行動作的 method 或 function 上。這可以節省大量的重覆程式碼,同時讓程式更加簡單易懂。

可別把這「省打字功夫」看小了,可大大有用呢:

http://wiki.python.org/moin/PythonDecoratorLibrary;


CategoryCookbook

Python/Cookbook/Decorator (上次是 localhost 在 2009-04-01 04:14:21 編輯的)