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