說明:
decorator是2004 python 2.4版新增的語法,主要的降低了寫遞迴函數(Wrapper)時的難度,並強化了python2.2版新增的static methods跟class methods宣告方式,在整體程式碼也變得更簡潔。
功能:
在沒有decorator語法糖之前,如果要使用classmethod()物件,將方法包覆成另一個class,寫法必須如下:
**class** **C**:
**def** meth (cls):
...
meth = classmethod(meth) *# Rebind name to wrapped-up class method*
但如果method列表很長,很容易忘記函數主體後面的classmethod()調用。
所以更新的宣告方式便因此誕生,這個新的方式叫”Function decorators”. 這個名子的發想來自於classmethod(), staticmethod().
語法糖的符號則是借自於java的 ”@” 作為指示符,使用這個語法糖的方式如下:
**class** **C**:
@classmethod
**def** meth (cls):
...
@classmethod宣告的方式明顯比meth = classmethod(meth)宣告方式俐落且短很多,也更容易記住。
如果再使用更複雜一點的範例,更能夠顯示出此語法糖的優勢:
@A
@B
@C
**def** f ():
...
上面的式子等同如下,可以明顯看出,在複雜的函數帶入狀況,decorator裝飾符的重要性。
**def** f(): ...
f = A(B(C(f)))
範例:
下面是decorator實際的使用範例,在不修改本來函數的情況,判斷外面傳入的參數是否是int型態。