https:nolon.xyzpython
在學習python過程當中,相信你們對裝飾器的概念很模糊,我也是困惑了好久,決定寫一篇文章梳理一下。
簡單來講,能夠把裝飾器理解爲一個包裝函數的函數,在函數運行時增長功能但不影響這個函數原有內容,還能夠進行函數執行後的清理工做。框架
舉一個小例子函數
@func1 def func2(): pass
裝飾器作的事情就是func1(func2)
傳遞了一個函數對象到咱們的裝飾器裏面而後先執行裝飾器func1
其中的內容,而後再執行函數func2
。學習
好比舉一個普通裝飾器的例子this
#普通裝飾器 def func1(func): def add_func(): print('這是我要添加的功能') return func() return add_func @func1 def func2(): print('hello world') #func1裝飾器函數 #func2被裝飾的函數 >>>func2() 這是我要添加的功能 hello world
在這段代碼中func2()
至關於func1(func2)()->add_func()
,再想要執行func2()
函數時,先執行裝飾器func1()
函數,而且參數func
至關於func2()
。執行func1
函數時因爲返回值是add_func
,咱們執行的是func1(func2)()
,也就至關於執行add_func()
,輸出
'這是我添加的功能',返回一個func()
函數,也就是參數func
的調用,即對應的func2
函數的調用。code
def func1(func): def func2(): return func() return func1()
來一個帶參數的裝飾器吧對象
def func1(func): def func2(a,b): a=1 b=2 return func(a,b) return func() @func1 def func(x,y) print('this is a add func') print(x+y) >>>func(10,20) this is a add func 3
自這段代碼中被裝飾函數的參數傳遞到裝飾函數的變量中,也就是x
傳遞給了a
,y
傳遞給了b
,return func(a,b)
即調用了func
函數而且函數的參數爲a
和b
。get
再高級一點的 裝飾器函數帶參數 (哈哈,是否是感受有點懵了)變量
def arg_func(arg): def _func(func): def _func1(): if arg=='good': print('出去玩') if arg=='bad': print('不出去玩') return func() return _func1 return _func @arg_func('bad') def func(): print('bad day') @arg_func('good') def func1() print('good day') >>>func() 不出去玩 bad day >>>func1() 出去玩 good day
這段代碼其實很簡單,就是裝飾器多了一個參數用來判斷,看上去也很好理解。一樣,執行func
裝飾器接收函數(arg_func)
的參數是bad
,執行func1
函數,裝飾器接收函數的參數是good
進階
好了,到這裏,裝飾器的內容基本上就梳理完了,確定還有不全的地方或者很差的地方,但願小夥伴們能夠多多完善,有須要補充的或者須要改正的在下面留言告訴我哦 ( •̀ ω •́ )y!文章地址: