1. 程式人生 > >python3之裝飾器

python3之裝飾器

程序 功能 我們 welcom 理解 def 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)    #執行函數

python3之裝飾器