溫馨提示×

溫馨提示×

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

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

什么是Python中的裝飾器

發(fā)布時(shí)間:2020-08-25 14:20:49 來源:億速云 閱讀:147 作者:Leah 欄目:編程語言

這期內(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è)資訊頻道。

向AI問一下細(xì)節(jié)

免責(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)容。

AI