中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

什么是Python中的裝飾器

發布時間:2020-08-25 14:20:49 來源:億速云 閱讀:149 作者:Leah 欄目:編程語言

這期內容當中小編將會給大家帶來有關什么是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中的裝飾器了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

柳江县| 东宁县| 海伦市| 黑水县| 伊金霍洛旗| 二连浩特市| 茶陵县| 连城县| 海林市| 广平县| 敦煌市| 咸丰县| 宁海县| 察哈| 林州市| 杭州市| 类乌齐县| 晋江市| 玉树县| 临城县| 崇州市| 漾濞| 安图县| 大竹县| 八宿县| 克什克腾旗| 炎陵县| 临泽县| 宁河县| 视频| 高清| 金秀| 抚宁县| 渭源县| 银川市| 泾阳县| 龙川县| 义马市| 英超| 寻乌县| 临泽县|