裝飾器:本身是一個函數,用於裝飾其他函數。
作用:增強被裝飾函數的功能。
裝飾器通常把其他函數作爲參數,增加其功能。
例1:函數不需被調用,直接運行
>>> def deco(func): ######定義裝飾器函數,func函數爲參數
... print('before myfunc() called')
... func() #######調用原函數,也就是被裝飾的函數
... print('after myfunc() called ')
...
>>> @deco ######用@標識裝飾器
... def myfunc(): #########myfunc()將作爲函數傳入deco函數,被裝飾函數
... a = 1
... b = 2
... print(a+b)
...
before myfunc() called
3
after myfunc() called
例2:用內套函數,不讓函數直接運行
>>> def deco(func): ######定義函數,func函數爲參數
... def _deco(): ######定義內置函數,若每次函數,裝飾器執行結束,程序運行
... print('before myfunc() called')
... func() #######調用原函數,也就是被裝飾的函數
... print('after myfunc() called ')
... return _deco ######調用_deco函數,
...
>>> @deco ########定義裝飾器
... def myfunc(): ########被裝飾函數
... print('myfunc() called')
... return 'ok'
...
>>> myfunc() ################調用函數,被裝飾後功能加強
before myfunc() called
myfunc() called
after myfunc() called
>>> myfunc() ############可以多次調用
before myfunc() called
myfunc() called
after myfunc() called
例3:被裝飾的函數帶參數
>>> def deco(func): ########func只能是被裝飾函數,無論帶不帶參數,都這麼寫
... def _deco(a,b): ###########此函數參數,爲被裝飾參數的傳值
... print('before myfunc() called')
... ret = func(a,b) #############調用被裝飾函數,參數來之_deco(a,b)
... print('after myfunc() called()')
... return ret
... return _deco #########調用_deco函數
...
>>> @deco
... def myfunc(a,b): #######被裝飾函數帶參數
... print('myfunc(%s,%s) called' %(a,b))
... return a+b
...
>>> myfunc(1,2) #########調用被裝飾參數
before myfunc() called
myfunc(1,2) called
after myfunc() called()
3
函數運行說明:
myfunc()函數被調用,此時將作爲參數傳入deco函數,deco函數嵌套_deco函數,在解析到return _deco時,調用_deco(a,b)函數,輸出before myfunc() called,調用func(a,b)函數,輸出函數內容myfunc(1,2) called, 並將返回值賦給ret,之後輸出after myfunc() called(),輸出ret,程序運行結束。
參考;
http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html