裝飾方法的產生:
- def deco(func):
- """無參數調用decorator聲明時必須有一個參數,這個參數將接收要裝飾的方法"""
- print "Enter decorator" #進行額外操作
- func.attr = 'decorated' #對函數進行操作,增加一個函數屬性
- return func #返回一個可調用對象(此例還是返回作爲輸入參數的方法)
- #返回一個新函數時,新函數可以是一個全局方法或者decorator函數的內嵌函數,
- #只要函數的簽名和被裝飾的函數相同
- @deco
- def MyFunc(): #應用@deco修飾的方法
- print "Enter MyFunc"
- MyFunc() #調用被裝飾的函數
- def deco(func):
- def replaceFunc(): #定義一個內嵌函數,此函數包裝了被裝飾的函數,並提供額外操作的代碼
- print "Enter decorator" #進行額外操作
- return func() #產生對被裝飾函數的調用
- return replaceFunc #由於返回的是這個新的內嵌函數,所以確保額外操作每次調用得以運行
- @deco
- def MyFunc(): #應用@deco修飾的方法
- print "Enter MyFunc"
- MyFunc() #調用被裝飾的函數
有參數decorator:
- def decoWithArgs(arg):
- """由於有參數的decorator函數在調用時只會使用應用時的參數而不接收被裝飾的函數做爲參數,
- 所以必須返回一個decorator函數, 由它對被裝飾的函數進行封裝處理"""
- def newDeco(func): #定義一個新的decorator函數
- def replaceFunc(): #在decorator函數裏面再定義一個內嵌函數,由它封裝具體的操作
- print "Enter decorator" #進行額外操作
- return func() #對被裝飾函數進行調用
- return replaceFunc
- return newDeco #返回一個新的decorator函數
- @decoWithArgs("demo")
- def MyFunc(): #應用@decoWithArgs修飾的方法
- print "Enter MyFunc"
- MyFunc() #調用被裝飾的函數
由 quke.cn 在 2008-11-10 02:35:34 做最後一次更新!