python3之裝飾器


1、裝飾器

裝飾器本質上是一個python函數,它可以讓其他函數在不需要做任何代碼變動的前提下增加額外功能,裝飾器的返回值也是一個函數對象。它經常用於有切面需求的場景,比如:插入日志、性能測試、事務處理、緩存、權限驗證等場景,裝飾器是解決這類問題的絕佳設計,有了裝飾器,我們就可以抽離出大量與函數功能本身無關的雷同代碼並繼續重用。概括的講,裝飾器的作用就是為已經存在的對象添加額外的功能。

裝飾器的實現原理:

#無參數裝飾器原理:
def login(funct):
    print('passed user veriftcation...')
    return funct   #函數返回形參的值或內存地址

def tv():
    print('welcom  to TV page')
tvv= login(tv)   #執行login函數,參數tv返回tv函數的內存地址
tvv()  #執行生成器函數將執行tv函數

傳參數裝飾器原理:

#實例:實現程序執行前的驗證
def login(funct):   #驗證函數
    def inner(arg):  #嵌套函數是為了不讓驗證函數不執行
        print('passed user veriftcation...')
        funct(arg)
    return inner    #將內嵌函數內存地址返回給login

@login     #@是裝飾器的語法糖,它實際就是等於tv=login(tv)
def tv(name):   #執行程序函數
    print('welcom %s to TV page' %name)

#tv = login(tv)    #相當與@login,與裝飾器的作用一樣
tv('zhang')    #執行程序前,通過裝飾器驗證

#上面程序執行原理說明:
#程序執行后,首先掃描程序內的裝飾器(@login)執行后,跳轉到裝飾器函數
#將函數讀取到內存,login將返回inner函數的內存地址,執行tv時,首先執行inner函數,tv參數‘zhang’傳遞給inner,打印輸出,funct參數值為tv,執行funct后就會執行tv函數。理解裝飾器原理就是把tv函數包起來執行,先驗證后執行。

裝飾器下的函數返回值:

def login(funct):
    def inner(*args,**kwargs):
        print('passed user veriftcation...')
        return funct(*args,**kwargs)   #inner的返回值就是tv的返回值
    return inner

#@login
def tv(*args,**kwargs):
    print('welcom %s to TV page %s' %(args,kwargs))
    return 88    #返回值
tv = login(tv)
dic = {'k1':'v1','k2':'v2'}
li = ['python','java']
t = tv(dic,li)
print(t)

 裝飾器帶傳參函數,多層裝飾器:

#驗證函數
def login(*args,**kwargs):
    print('%s登陸驗證%s!'%(args,kwargs))
#登陸后操作
def quanxian(*args,**kwargs):
    print('%s登陸后操作!%s'%(args,kwargs))
#裝飾器
def decorator(login_func,quanxian_func): #傳參2個函數
    def inner(index_func):   #傳參登陸函數
        def inner2(*args,**kwargs):  #接收index的傳參
            login_func(*args,**kwargs)  #執行login函數
            index_func(*args,**kwargs)  #執行index函數
            quanxian_func(*args,**kwargs)  #執行quanxian函數
        return inner2   #返回函數地址
    return inner  #返回函數地址
@decorator(login,quanxian)  #執行裝飾器
def index(*args,**kwargs):  #登陸函數
    print('登陸后台!%s,%s'%(args,kwargs))
l1 = [1,2,3,4]
dic = {'k1':'v1','k2':'v2'}
index(l1,dic)    #執行函數

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM