您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)python裝飾器的用途是什么的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個參考。一起跟隨小編過來看看吧。
首先,什么是裝飾器?
比較官方的解釋是:
裝飾器是用來管理和調(diào)用函數(shù)和類的一個可調(diào)用對象,也就是說分為函數(shù)裝飾器和類裝飾器
這個定義函數(shù)我自己通俗化了一點(diǎn),不然更加看不懂,其實(shí)我還有一句更加概括的話,可以解釋裝飾器:
裝飾器就是對被裝飾的對象(函數(shù)、類)進(jìn)行重構(gòu)的,其可以在不改變原來對象的情況下調(diào)用對象時執(zhí)行重構(gòu)后的行為
這里你可能就糊涂了,看不懂
沒關(guān)系我們慢慢來!??!
首先,裝飾器的語法你肯定知道
def decorator(f): def wrapper(x,y): return x+y return wrapper @decorator def func(x,y): return 1 func(3,4)
那,看這段代碼,你可能根據(jù)上面你有幾個疑問:
一、decorator是什么意思?
二、這里重構(gòu)的行為是什么?
三、整個裝飾的行為或者說流程是怎么樣的?
我們看上面那一段代碼,很顯然,說過裝飾器就是一個可調(diào)用對象,這個沒問題吧,在上面的裝飾器它就是一個函數(shù)。
重構(gòu)的行為是什么?
上面的一段代碼的重構(gòu)行為就是講func的執(zhí)行代碼替換成了wrapper的執(zhí)行代碼,也就是說,代碼的最終輸入是 7 而不是 1。
其實(shí)上面的兩個問題是廢話,我們解決了第三個問題,自然而然的就理解了!
好了,在繼續(xù)看之前我們記住一句話:
裝飾器本身接受被裝飾的對象,裝飾器返回的可調(diào)用對象接受被裝飾對象的所有參數(shù)
一定要仔細(xì)看這句話,理解加記憶!
在上面那一段代碼中
裝飾器是: decorator
返回的可調(diào)用對象是: wrapper
被裝飾的對象是 :func
好了,你先在套這個你去看看這個這個函數(shù)的執(zhí)行流程
當(dāng)然,這時候你還會有一個疑問:
當(dāng)調(diào)用func(3,4)的時候發(fā)生了什么?
此時:返回的可調(diào)用對象(wrapper)給了func,你也可以理解為現(xiàn)在的func的代碼是
def func(x,y): return x+y
這時的func就完全不是自己本身定義的func的,它是不是在某種意義上算是被重構(gòu)了!
到這里你是不是理解了什么是裝飾器,應(yīng)該是理解了!
不過我們還沒有結(jié)束,因?yàn)槲乙屇銖氐椎牧私馐裁词茄b飾器!
之前我們說過,不止有函數(shù)裝飾器,還有類裝飾器,那接下來我們就看看類裝飾器是怎么工作的,我還是要把之前那段話貼在這里,你別忘了!
裝飾器本身接受被裝飾的對象,裝飾器返回的可調(diào)用對象接受被裝飾對象的所有參數(shù)
class Decorator: def __init__(self,f): self.func = f def __call__(self,x,y): return self.func(x,y) + 1 @Decorator def func(x,y): return x+y func(3,4) # 你來想想這時候的結(jié)果是什么?
我們來一步步的分析一下,
首先,我們說裝飾器只接受被裝飾的對象做參數(shù),也就是說此時有
Decorator(func) # 這段代碼對應(yīng)著第一句話 # 接下來是 func(3,4) # 這句話是不是觸動了__call__方法 # 接下來就是第二句話:返回的可調(diào)用對象接受被裝飾對象的所有參數(shù) # 所以3,4就被傳遞給了__call__方法 # 此時的func是什么 return self.func(x,y) + 1 # 也就是說結(jié)果為8,而不是7
接下來來點(diǎn)難的看看:
def decorator(f): def wrapper(self,x,y): return self.name + x + y return wrapper class C: name = '土' @decorator def method(x,y): return x + y ins = C() myname = ins.method('行','孫')
感謝各位的閱讀!關(guān)于python裝飾器的用途是什么就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。