python3之裝飾器
阿新 • • 發佈:2017-12-08
程序 功能 我們 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) returninner #將內嵌函數內存地址返回給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之裝飾器