您好,登錄后才能下訂單哦!
這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)什么是Python中的裝飾器,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
什么是裝飾器
裝飾器是程序開發(fā)中經(jīng)常會使到的一個(gè)功能,所以這也是Python面試中必問的問題。
定義:
裝飾器本身就是一個(gè)函數(shù),為其他函數(shù)提供附加功能,不改變被修飾函數(shù)的源代碼,不改變原調(diào)用方式,裝飾器=高階函數(shù)+嵌套函數(shù)。
知識點(diǎn):
函數(shù)本身就是一個(gè)變量(意味著可以被復(fù)制給一個(gè)變量:test=test(1) )。
高階函數(shù):把函數(shù)名當(dāng)成一個(gè)實(shí)參傳遞給另一個(gè)函數(shù)func(test1) (不改變源代碼的前提下添加代碼)。
返回值中包含函數(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ǔ)平臺部門,基礎(chǔ)平臺負(fù)責(zé)提供底層的功能,如:數(shù)據(jù)庫操作、redis調(diào)用、監(jiān)控API等功能。研發(fā)部行使基礎(chǔ)功能時(shí),只需調(diào)用基礎(chǔ)平臺提供的功能即可。如下:
--------------基礎(chǔ)平臺提供的功能-------------- def func1(): pass def func2(): pass def func3(): pass --------------研發(fā)部門A使用基礎(chǔ)平臺-------------- func1() func2() func3() --------------研發(fā)部門B使用基礎(chǔ)平臺-------------- func1() func2() func3()
隨著項(xiàng)目進(jìn)度的深入,產(chǎn)品經(jīng)理提出,要在基礎(chǔ)平臺的提供的所有功能中,添加驗(yàn)證功能,不能誰都可以使用基礎(chǔ)平臺的全部功能,即執(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),開始自己改代碼:
--------------基礎(chǔ)平臺提供的功能-------------- 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ǔ)平臺-------------- func1() func2() func3() --------------研發(fā)部門B使用基礎(chǔ)平臺-------------- func1() func2() func3()
沒過多久小B也被開除了。。。
項(xiàng)目經(jīng)理又把工作交給了小C,小C對基礎(chǔ)平臺代碼進(jìn)行重構(gòu),其他業(yè)務(wù)部門無需做任何修改。
--------------基礎(chǔ)平臺提供的功能-------------- 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ǔ)平臺-------------- func1() func2() func3() --------------研發(fā)部門B使用基礎(chǔ)平臺-------------- func1() func2() func3()
項(xiàng)目經(jīng)理看后表示還不錯(cuò),但是感覺還是差了一點(diǎn)點(diǎn),于是決定不再低調(diào),再也不讓小弟做了,于是自己做了一個(gè)方案:
--------------基礎(chǔ)平臺提供的功能-------------- 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ǔ)平臺-------------- func1() func2() func3() --------------研發(fā)部門B使用基礎(chǔ)平臺-------------- func1() func2() func3()
對于上述代碼,也是僅僅對基礎(chǔ)平臺的代碼進(jìn)行修改, func1(), func2(), func3()之前都進(jìn)行【驗(yàn)證】操作,并且其他研發(fā)部也無需做任何操作。
單獨(dú)以func1()為例講解:
def check_login(func): def inner(): #驗(yàn)證1 #驗(yàn)證2 func() return inner @check_login def func1(): pass
python解釋器就會從上到下解釋代碼,步驟如下:
1 def check_login(func): ==>將check_login函數(shù)加載到內(nèi)存
2 @check_login
沒錯(cuò), 從表面上看解釋器僅僅會解釋這兩句代碼,因?yàn)楹瘮?shù)在沒有被調(diào)用之前其內(nèi)部代碼不會被執(zhí)行。從表面上看解釋器著實(shí)會執(zhí)行這兩句。
上例@check_login內(nèi)部會執(zhí)行以下操作:
執(zhí)行check_login函數(shù),并將@check_login下面的函數(shù)作為check_login函數(shù)的參數(shù),
即@check_login等價(jià)于check_login(func1),所以內(nèi)部就會去執(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í),就會執(zhí)行新func1函數(shù),在新func1函數(shù)內(nèi)部先執(zhí)行驗(yàn)證,再執(zhí)行原來的func1函數(shù),然后將原來func1函數(shù)的返回值返回給了業(yè)務(wù)調(diào)用者。
上述就是小編為大家分享的什么是Python中的裝飾器了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。