理解python中裝飾器的作用
裝飾器的作用就是用一個(gè)新函數(shù)封裝舊函數(shù)(是舊函數(shù)代碼不變的情況下增加功能)然后會(huì)返回一個(gè)新函數(shù),新函數(shù)就叫做裝飾器,一般為了簡(jiǎn)化裝飾器會(huì)用語(yǔ)法糖@新函數(shù)來(lái)簡(jiǎn)化
例子:
這是一段代碼,但功能太少,要對(duì)這個(gè)進(jìn)行增強(qiáng),但又不能改變代碼。
def hello(): return "hello world!"
現(xiàn)在我們的需求是要增強(qiáng)hello()函數(shù)的功能,希望給返回加上HTML標(biāo)簽,比如<i>hello world</i>,但要求我們不得改變hello()函數(shù)原來(lái)的定義。
def makeitalic(fun):#makitalic傳了一個(gè)新函數(shù) def wrapped():#內(nèi)部函數(shù) return "<i>"+fun()+"</i>"#要加的新功能 return wrapped#返回的是wrapped函數(shù)功能 def hello():#對(duì)這個(gè)功能進(jìn)行增強(qiáng) return "hello world!" #makeitalic里面?zhèn)魅肓薶ello函數(shù),然后內(nèi)部函數(shù)fun()函數(shù)也就相當(dāng)于hello函數(shù)了 hello_2=makeitalic(hello) #打印新函數(shù),返回的就是<i>hello world!</i> print(hello_2())
為了增強(qiáng)原函數(shù)hello的功能,定義了一個(gè)函數(shù),它接收原函數(shù)作為參數(shù),并返回一個(gè)新的函數(shù),在這個(gè)返回的函數(shù)中,執(zhí)行了原函數(shù),并對(duì)原函數(shù)的功能進(jìn)行了增強(qiáng)。
事實(shí)上,makeitalic就是一個(gè)裝飾器(decorator),它封裝了原函數(shù)hello,并返回了一個(gè)新函數(shù),用于增強(qiáng)原函數(shù)的功能,并將其賦值給hello。
一般情況下,我們使用裝飾器提供的@語(yǔ)法糖(Syntactic Sugar),來(lái)簡(jiǎn)化上面的操作。
####使用@語(yǔ)法糖 def makeitalic(fun): def wrapped(): return "<i>" + fun() + "</i>" return wrapped @makeitalic#使用了裝飾器可以直接調(diào)用,不需要賦值了 def hello(): return "hello world" print(hello())#使用了裝飾器可以直接調(diào)用,不需要賦值了
像上面的情況,可以動(dòng)態(tài)的修改函數(shù)(或類的)功能的函數(shù)就是裝飾器。本質(zhì)上,它是一個(gè)高階函數(shù),以被裝飾的函數(shù)(比如上面的hello)為參數(shù),并返回一個(gè)包裝后的函數(shù)(比如上面的wrapped)給被修飾函數(shù)(hello)。
當(dāng)調(diào)用hello()函數(shù)時(shí),hello函數(shù)的執(zhí)行流程如下分析:
1.把hello函數(shù)作為參數(shù)傳給@符號(hào)后面的裝飾器函數(shù)。
2.然后開始執(zhí)行裝飾器函數(shù),并返回一個(gè)包裝了的函數(shù),同時(shí),改變?cè)瘮?shù)的指向,現(xiàn)在原函數(shù)指向了這個(gè)包裝函數(shù)。
3.執(zhí)行原函數(shù),其實(shí)此時(shí)執(zhí)行的是包裝了的函數(shù),所以說,裝飾器增強(qiáng)了一個(gè)現(xiàn)有函數(shù)的功能,但不會(huì)改變現(xiàn)有函數(shù)的定義。
普通裝飾器的使用形式:
@decorator def fun(): pass #格式就如同下面的: def fun(): pass fun = decorator(fun)#不使用語(yǔ)法糖要進(jìn)行賦值
裝飾器可以定義多個(gè),離函數(shù)定義最近的裝飾器最先被調(diào)用,比如:
@decotator_one @decorator_two def fun(): pass #格式如同下面的: def fun(): pass fun = decorator_one(decorator_two(fun))
裝飾器還可以帶參數(shù),比如:
@decorator(arg1, arg2) def fun(): pass #格式如同下面的: def fun(): pass fun = decorator(arg1, arg2)(fun)
到此這篇關(guān)于python中裝飾器的作用的文章就介紹到這了,更多相關(guān)python裝飾器作用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Django 后臺(tái)帶有字典的列表數(shù)據(jù)與頁(yè)面js交互實(shí)例
這篇文章主要介紹了Django 后臺(tái)帶有字典的列表數(shù)據(jù)與頁(yè)面js交互實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-04-04Python爬蟲小練習(xí)之爬取并分析騰訊視頻m3u8格式
讀萬(wàn)卷書不如行萬(wàn)里路,學(xué)的扎不扎實(shí)要通過實(shí)戰(zhàn)才能看出來(lái),本篇文章手把手帶你爬下騰訊視頻的m3u8格式來(lái)分析,大家可以在過程中查缺補(bǔ)漏,看看自己掌握程度怎么樣2021-10-10Python數(shù)據(jù)可視化編程通過Matplotlib創(chuàng)建散點(diǎn)圖代碼示例
這篇文章主要介紹了Python數(shù)據(jù)可視化編程通過Matplotlib創(chuàng)建散點(diǎn)圖實(shí)例,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-12-12python從入門到實(shí)踐之組合數(shù)據(jù)類型
這篇文章主要為大家介紹了python組合數(shù)據(jù)類型,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-01-01基于MATLAB和Python實(shí)現(xiàn)MFCC特征參數(shù)提取
這篇文章主要介紹了基于MATLAB和Python實(shí)現(xiàn)MFCC特征參數(shù)提取,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08