python3?最常用的三種裝飾器語(yǔ)法匯總
python3 最常用的三種裝飾器語(yǔ)法總結(jié)
1.簡(jiǎn)述語(yǔ)法
裝飾器也叫函數(shù)裝飾器,主要作用是在不修改原來(lái)函數(shù)的代碼情況下(函數(shù)本身不會(huì)被修改,執(zhí)行方式也不變化),增加的一個(gè)"裝飾"函數(shù),把原來(lái)的函數(shù)當(dāng)成一個(gè)整體,像傳參一樣給這個(gè)函數(shù)使用,并返回這個(gè)"函數(shù)"。這個(gè)過(guò)程中我們?cè)黾右恍┖瘮?shù)相關(guān)的代碼,當(dāng)函數(shù)被執(zhí)行的時(shí)候,就會(huì)一起執(zhí)行,相當(dāng)于讓函數(shù)增加了更多的功能。
常用的方面:
1.1為函數(shù)增加日志記錄功能:許多函數(shù)寫的時(shí)候,并沒(méi)有寫日志記錄功能,通過(guò)統(tǒng)一添加日志記錄的裝飾器,就無(wú)需更改代碼,從而實(shí)現(xiàn)記錄的功能。
1.2為函數(shù)實(shí)現(xiàn)驗(yàn)證功能:函數(shù)執(zhí)行的時(shí)候,增加驗(yàn)證是否合規(guī)的裝飾器,這是一些安全的措施,有時(shí)候非常必要。
1.3補(bǔ)救函數(shù)功能:項(xiàng)目結(jié)束后,發(fā)現(xiàn)重大BUG,可以通過(guò)過(guò)增加裝飾器的方式修復(fù),大量降低工作量。
2.不帶參數(shù)的函數(shù)的裝飾器
理解:@符號(hào)就是寫一個(gè)裝飾器,最基本的裝飾器,就是寫一個(gè)函數(shù),并返回一個(gè)傳入的參數(shù)。本質(zhì)就是把整個(gè)函數(shù)當(dāng)成了參數(shù),并返回,這個(gè)過(guò)程沒(méi)有執(zhí)行函數(shù),只增加了一個(gè)描述信息,如:國(guó)家。
def mycountry(m):
country = "china"
print(country)
return m
@mycountry
def myname():
name = "chengruofei"
print(name)
return name
myname()
執(zhí)行結(jié)果:
python myname.py
china
chengruofei
備注:
把@符號(hào)理解成省略了第一步的賦值,會(huì)不會(huì)豁然開朗:
myname = mycountry(myname)
myname()
3.帶參數(shù)的函數(shù)的裝飾器
**理解:**只需要在裝飾器函數(shù)中,增加一個(gè)函數(shù),并且里面一定要組合傳入的“兩個(gè)參數(shù)”為新的函數(shù),此時(shí)返回值就變成了構(gòu)造的函數(shù)。
def mycountry(m):
country = "china"
print(country)
def myb(bb):
m(bb)
print("TEST boy")
return myb
@mycountry
def myname(b):
name = "chengruofei"
print(name)
print("I am a :",b)
return name
myname("boy")
執(zhí)行結(jié)果:
china
chengruofei
('I am a :', 'boy')
TEST boy
備注:
通過(guò)裝飾器的函數(shù)返回值,就丟失了。
4.帶參數(shù)的裝飾器
**理解:**本來(lái)裝飾器是沒(méi)有參數(shù)的,參數(shù)是根據(jù)函數(shù)的定義與否去設(shè)定的。但是有時(shí)候裝飾器是個(gè)復(fù)雜的函數(shù),集合了大量的功能,就需要帶入?yún)?shù)去執(zhí)行合適的裝飾器函數(shù)。只需要在原本的解釋器外層加上一層函數(shù),并將中間層函數(shù)作為整體返回。
def myID(i):
if i == 'mycountry':
def mycountry(m):
country = "china"
print(country)
def myb(bb):
m(bb)
print("TEST boy")
return myb
return mycountry
else:
def myschool(m):
school = "shijiazhuangjisuanjizhiyejishuxueyuan"
print("I graduated from ",school)
def myb(bb):
m(bb)
print("TEST boy")
return myb
return myschool
@myID('myschool')
def myname(b):
name = "chengruofei"
print(name)
print("I am a :",b)
return name
myname("boy")
執(zhí)行結(jié)果:
('I graduated from ', 'shijiazhuangjisuanjizhiyejishuxueyuan')
chengruofei
('I am a :', 'boy')
TEST boy
到此這篇關(guān)于python3 最常用的三種裝飾器語(yǔ)法總結(jié)的文章就介紹到這了,更多相關(guān)python3裝飾器語(yǔ)法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
利用Python對(duì)文件夾下圖片數(shù)據(jù)進(jìn)行批量改名的代碼實(shí)例
今天小編就為大家分享一篇關(guān)于利用Python對(duì)文件夾下圖片數(shù)據(jù)進(jìn)行批量改名的代碼實(shí)例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02
python訪問(wèn)類中docstring注釋的實(shí)現(xiàn)方法
這篇文章主要介紹了python訪問(wèn)類中docstring注釋的實(shí)現(xiàn)方法,涉及python類注釋的訪問(wèn)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-05-05
關(guān)于Python核心框架tornado的異步協(xié)程的2種方法詳解
今天小編就為大家分享一篇關(guān)于Python核心框架tornado的異步協(xié)程的2種方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08
django為Form生成的label標(biāo)簽添加class方式
這篇文章主要介紹了django為Form生成的label標(biāo)簽添加class方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05
python實(shí)現(xiàn)微信小程序的多種支付方式
這篇文章主要為大家介紹了python實(shí)現(xiàn)微信小程序的多種支付方式的實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04
Python 循環(huán)語(yǔ)句之 while,for語(yǔ)句詳解
Python中有兩種循環(huán),分別為:for循環(huán)和while循環(huán)。 for循環(huán)可以遍歷任何序列的項(xiàng)目,如一個(gè)列表或者一個(gè)字符串。while 語(yǔ)句用于循環(huán)執(zhí)行程序,即在某條件下,循環(huán)執(zhí)行某段程序,以處理需要重復(fù)處理的相同任務(wù)。2018-04-04
Python基本結(jié)構(gòu)之判斷語(yǔ)句的用法詳解
在程序的設(shè)計(jì)當(dāng)中,代碼并不是逐步按照順序進(jìn)行執(zhí)行的,在運(yùn)行到某一行代碼當(dāng)中,需要停下進(jìn)行判斷接下來(lái)將要運(yùn)行到那一個(gè)分支代碼,這種判斷就代表的是分支結(jié)構(gòu)。分支結(jié)構(gòu)是可以使用?if?語(yǔ)句來(lái)進(jìn)行判斷的,而我們本篇博客講的也是?if?語(yǔ)句,需要的可以了解一下2022-07-07
Django重裝mysql后啟動(dòng)報(bào)錯(cuò):No module named ‘MySQLdb’的解決方法
這篇文章主要給大家介紹了關(guān)于Django重裝mysql后啟動(dòng)報(bào)錯(cuò):No module named ‘MySQLdb’的解決方法,分享出來(lái),對(duì)同樣遇到這個(gè)問(wèn)題的朋友們一個(gè)參考學(xué)習(xí),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-04-04

