原文地址
在學習python過程中,相信大家對裝飾器的概念很模糊,我也是困惑了很久,決定寫一篇文章梳理一下。
首先要搞清楚什麼是裝飾器:
簡單來說,可以把裝飾器理解爲一個包裝函數的函數,在函數運行時增加功能但不影響這個函數原有內容,還可以進行函數執行後的清理工作。
舉一個小例子
@func1
def func2():
pass
裝飾器做的事情就是func1(func2)
傳遞了一個函數對象到我們的裝飾器裏面然後先執行裝飾器func1
其中的內容,然後再執行函數func2
。
比如舉一個普通裝飾器的例子
#普通裝飾器
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
函數的調用。
裝飾器的基本框架
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
。
再高級一點的 裝飾器函數帶參數 (哈哈,是不是感覺有點懵了)
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!文章地址: