創(chuàng)新互聯(lián)www.cdcxhl.cn八線動(dòng)態(tài)BGP香港云服務(wù)器提供商,新人活動(dòng)買多久送多久,劃算不套路!
創(chuàng)新互聯(lián)是少有的網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、營(yíng)銷型企業(yè)網(wǎng)站、小程序開(kāi)發(fā)、手機(jī)APP,開(kāi)發(fā)、制作、設(shè)計(jì)、買鏈接、推廣優(yōu)化一站式服務(wù)網(wǎng)絡(luò)公司,從2013年開(kāi)始,堅(jiān)持透明化,價(jià)格低,無(wú)套路經(jīng)營(yíng)理念。讓網(wǎng)頁(yè)驚喜每一位訪客多年來(lái)深受用戶好評(píng)這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)什么是Python中的裝飾器,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
什么是裝飾器
裝飾器是程序開(kāi)發(fā)中經(jīng)常會(huì)使到的一個(gè)功能,所以這也是Python面試中必問(wèn)的問(wèn)題。
定義:
裝飾器本身就是一個(gè)函數(shù),為其他函數(shù)提供附加功能,不改變被修飾函數(shù)的源代碼,不改變?cè){(diào)用方式,裝飾器=高階函數(shù)+嵌套函數(shù)。
知識(shí)點(diǎn):
函數(shù)本身就是一個(gè)變量(意味著可以被復(fù)制給一個(gè)變量:test=test(1) )。
高階函數(shù):把函數(shù)名當(dāng)成一個(gè)實(shí)參傳遞給另一個(gè)函數(shù)func(test1) (不改變?cè)创a的前提下添加代碼)。
返回值中包含函數(shù)名return deco (不改變函數(shù)的調(diào)用方式)。
嵌套函數(shù):函數(shù)中加入新的函數(shù)。
典型結(jié)構(gòu):
def func(args): def func_in(args_in): pass return func_in
三、裝飾器案例
1、先看一個(gè)例子
某公司有多個(gè)研發(fā)部門,1個(gè)基礎(chǔ)平臺(tái)部門,基礎(chǔ)平臺(tái)負(fù)責(zé)提供底層的功能,如:數(shù)據(jù)庫(kù)操作、redis調(diào)用、監(jiān)控API等功能。研發(fā)部行使基礎(chǔ)功能時(shí),只需調(diào)用基礎(chǔ)平臺(tái)提供的功能即可。如下:
--------------基礎(chǔ)平臺(tái)提供的功能-------------- def func1(): pass def func2(): pass def func3(): pass --------------研發(fā)部門A使用基礎(chǔ)平臺(tái)-------------- func1() func2() func3() --------------研發(fā)部門B使用基礎(chǔ)平臺(tái)-------------- func1() func2() func3()
隨著項(xiàng)目進(jìn)度的深入,產(chǎn)品經(jīng)理提出,要在基礎(chǔ)平臺(tái)的提供的所有功能中,添加驗(yàn)證功能,不能誰(shuí)都可以使用基礎(chǔ)平臺(tái)的全部功能,即執(zhí)行功能前,先進(jìn)行驗(yàn)證。
項(xiàng)目經(jīng)理將此功能交給了小A去實(shí)現(xiàn)。
小A就去和每個(gè)研發(fā)部溝通,讓每個(gè)研發(fā)部自己把驗(yàn)證的代碼加上,結(jié)果第二天就被辭職了。
項(xiàng)目經(jīng)理又將此功能交給了小B去實(shí)現(xiàn)。
小B吸取小A的經(jīng)驗(yàn),開(kāi)始自己改代碼:
--------------基礎(chǔ)平臺(tái)提供的功能-------------- def func1(): #驗(yàn)證1 #驗(yàn)證2 pass def func2(): #驗(yàn)證1 #驗(yàn)證2 pass def func3(): #驗(yàn)證1 #驗(yàn)證2 pass --------------研發(fā)部門A使用基礎(chǔ)平臺(tái)-------------- func1() func2() func3() --------------研發(fā)部門B使用基礎(chǔ)平臺(tái)-------------- func1() func2() func3()
沒(méi)過(guò)多久小B也被開(kāi)除了。。。
項(xiàng)目經(jīng)理又把工作交給了小C,小C對(duì)基礎(chǔ)平臺(tái)代碼進(jìn)行重構(gòu),其他業(yè)務(wù)部門無(wú)需做任何修改。
--------------基礎(chǔ)平臺(tái)提供的功能-------------- def check_login(): #驗(yàn)證1 #驗(yàn)證2 pass def func1(): check_login() pass def func2(): check_login() pass def func3(): check_login() pass --------------研發(fā)部門A使用基礎(chǔ)平臺(tái)-------------- func1() func2() func3() --------------研發(fā)部門B使用基礎(chǔ)平臺(tái)-------------- func1() func2() func3()
項(xiàng)目經(jīng)理看后表示還不錯(cuò),但是感覺(jué)還是差了一點(diǎn)點(diǎn),于是決定不再低調(diào),再也不讓小弟做了,于是自己做了一個(gè)方案:
--------------基礎(chǔ)平臺(tái)提供的功能-------------- def check_login(func): def inner(): #驗(yàn)證1 #驗(yàn)證2 func() return inner @check_login def func1(): pass @check_login def func2(): pass @check_login def func3(): pass --------------研發(fā)部門A使用基礎(chǔ)平臺(tái)-------------- func1() func2() func3() --------------研發(fā)部門B使用基礎(chǔ)平臺(tái)-------------- func1() func2() func3()
對(duì)于上述代碼,也是僅僅對(duì)基礎(chǔ)平臺(tái)的代碼進(jìn)行修改, func1(), func2(), func3()之前都進(jìn)行【驗(yàn)證】操作,并且其他研發(fā)部也無(wú)需做任何操作。
單獨(dú)以func1()為例講解:
def check_login(func): def inner(): #驗(yàn)證1 #驗(yàn)證2 func() return inner @check_login def func1(): pass
python解釋器就會(huì)從上到下解釋代碼,步驟如下:
1 def check_login(func): ==>將check_login函數(shù)加載到內(nèi)存
2 @check_login
沒(méi)錯(cuò), 從表面上看解釋器僅僅會(huì)解釋這兩句代碼,因?yàn)楹瘮?shù)在沒(méi)有被調(diào)用之前其內(nèi)部代碼不會(huì)被執(zhí)行。從表面上看解釋器著實(shí)會(huì)執(zhí)行這兩句。
上例@check_login內(nèi)部會(huì)執(zhí)行以下操作:
執(zhí)行check_login函數(shù),并將@check_login下面的函數(shù)作為check_login函數(shù)的參數(shù),
即@check_login等價(jià)于check_login(func1),所以內(nèi)部就會(huì)去執(zhí)行:
def check_login(func): def inner(): #驗(yàn)證1 #驗(yàn)證2 func() #func是參數(shù)。此時(shí)的func就是函數(shù)func1() #返回inner,inner的內(nèi)部就是執(zhí)行func1()函數(shù),但是執(zhí)行func1()函數(shù)前,進(jìn)行了驗(yàn)證1,驗(yàn)證2 return inner
check_login() 的返回值
將執(zhí)行完的chenk_login函數(shù)返回值賦值 給@check_login下面的函數(shù)的函數(shù)名func1 即將check_login()的返回值再重新賦值給func1,即:
新func1 = def inner(): #驗(yàn)證1 #驗(yàn)證2 func() #func是參數(shù)。此時(shí)的func就是函數(shù)func1() #返回inner,inner的內(nèi)部就是執(zhí)行func1()函數(shù),但是執(zhí)行func1()函數(shù)前,進(jìn)行了驗(yàn)證1,驗(yàn)證2 return inner
所以,以后研發(fā)部門想要執(zhí)行func1函數(shù)時(shí),就會(huì)執(zhí)行新func1函數(shù),在新func1函數(shù)內(nèi)部先執(zhí)行驗(yàn)證,再執(zhí)行原來(lái)的func1函數(shù),然后將原來(lái)func1函數(shù)的返回值返回給了業(yè)務(wù)調(diào)用者。
上述就是小編為大家分享的什么是Python中的裝飾器了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道。