python之裝飾器


裝飾器:本身是一個函數,用於裝飾其他函數。

作用:增強被裝飾函數的功能。


裝飾器通常把其他函數作爲參數,增加其功能。


例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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章