您好,登錄后才能下訂單哦!
小編給大家分享一下關(guān)于Python閉包裝飾器的簡介,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討方法吧!
閉包內(nèi)容:
匿名函數(shù):能夠完成簡單的功能,傳遞這個函數(shù)的引用,只有功能
普通函數(shù):能夠完成復(fù)雜的功能,傳遞這個函數(shù)的引用,只有功能
閉包:能夠完成較為復(fù)雜的功能,傳遞這個閉包中的函數(shù)以及數(shù)據(jù),因此傳遞是功能+數(shù)據(jù)
對象:能夠完成最復(fù)雜的功能,傳遞很多數(shù)據(jù)+很多功能,因此傳遞的是數(shù)據(jù)+功能
———————————————————
對全局函數(shù)進行修改:在函數(shù)當(dāng)中加global,在閉包中外邊中的變量加nonlocal
閉包定義:有兩個函數(shù)嵌套使用,里面的函數(shù)可以使用外面函數(shù)所傳輸?shù)膮?shù),最后可傳遞的是里面函數(shù)的結(jié)構(gòu)與數(shù)據(jù)(個人理解)。
最后閉包可以在python中引申出裝飾器 ———————————————————
def closure(): # 在函數(shù)內(nèi)部再定義一個函數(shù), # 并且這個函數(shù)用到了外邊函數(shù)的變量,那么將這個函數(shù)以及用到的一些變量稱之為閉包 def closure_in(x): print('---------我是打不死的%s--------' %x) return closure_in ​ x = closure() x('小強') ​ print('*'*20) # -----加餐--------- def closure_1(a,b,c): def closure_on(x): print('-----%s加餐-------' %b) print(a*x + c) return closure_on ​ demo = closure_1(2,'小強',3) #傳closure_1函數(shù) demo(4) #傳clsure_on函數(shù) ​ #注:函數(shù)不加括號,調(diào)用的是函數(shù)本身【function】;函數(shù)加括號,調(diào)用的是函數(shù)的return結(jié)果。
裝飾器內(nèi)容:
代碼要遵守‘開放封閉'原則;對已經(jīng)寫好的函數(shù)遵守封閉,對功能擴展遵守開放;
# 裝飾器的作用:為了對原來的代碼上進行擴展 def decoration(func): def call_func(): print('-------正在裝飾 -------' ) func() return call_func ​ #@decoration #--->demo_new = decoration(demo) def demo(): print('demo----') ​ demo_new = decoration(demo) demo_new()
使用裝飾器來測試一個函數(shù)的運行時:
import time def set_func(func): def call_func(): start_time = time.time() func() stop_func = time.time() print(‘a(chǎn)lltimes is %f' %(stop_func-start_fun)) return call_func @set_func def test1(): print(‘——-test1———') test1() ​ #等價于: @set_func==test1 = set_func(test1)
1. 沒有參數(shù),沒有返回值的函數(shù)進行裝飾:
def set_func(func): def call_func(): print(‘———test2——-') print(‘———-test3——') func() return call_func @set_func def test1(): print(‘——test1——- ')
2. 對有參數(shù)無返回值的函數(shù)進行裝飾:
def set_func(func): def call_func(a): #變 print(‘———test2——-') print(‘———-test3——') func(a) #變 return call_func @set_func def test1(num): print(‘——test1——- %d ' %num) ​ test1(100) —->call_func(100) test1(200)——>call_func(200)
復(fù)現(xiàn)裝飾器原理:
————————————————————————-
只要遇到@函數(shù) 裝飾器(這句話),在程序中就已經(jīng)執(zhí)行了??!
3. 不定長參數(shù)的函數(shù)裝飾:
def set_func(func): def call_func(*args,**kwargs): #變 print(‘———test2——-') print(‘———-test3——') func(*args,**kwargs) #(拆包)將元祖拆開,每個進行傳輸; #func(args,kwargs)—>不行,相當(dāng)于傳遞了兩個參數(shù):一個元祖,一個字典。 return call_func @set_func def test1(num,*args,**kwargs): print(‘——test1——- %d ' %num) print(‘——test1——- ' , args) print(‘——test1——- ' ,kwargs ) test1(100) test1(100,200) test1(100,200,300,mm=100)
注意:*args保存不定長參數(shù),以元祖保存,**kwargs保存字典形式(mm=...)
4.對應(yīng)的返回值參數(shù)進行裝飾、通用裝飾器:
#通用裝飾器 def set_func(func): print(“開始進行裝飾———-”) def call_func(*args,**kwargs): #變 print(‘———test2——-') print(‘———-test3——') return func(*args,**kwargs) #(拆包)將元祖拆開,每個進行傳輸;如果沒有return ret返回none。 #func(args,kwargs)—>不行,相當(dāng)于傳遞了兩個參數(shù):一個元祖,一個字典。 return call_func @set_func def test1(num,*args,**kwargs): print(‘——test1——- %d ' %num) print(‘——test1——- ' , args) print(‘——test1——- ' ,kwargs ) return ‘ok' #—-返回給上面的func(),然后return func—ret ret = test1(100)
5. 多個裝飾器對同一個函數(shù)進行裝飾:
def add_qx(func): print(“——開始進行裝飾權(quán)限1———-”) def call_func(*args,**kwargs): #變 print(‘這是權(quán)限驗證1') return func(*args,**kwargs) return call_func ​ def add_xx(func): print(“——開始進行裝飾xx功能———-”) def call_func(*args,**kwargs): #變 print(‘這是xx權(quán)限驗證') return func(*args,**kwargs) return call_func @add_qx @add_xx def test1(): print(‘——test1——-') test1()
首先執(zhí)行第一個,但是第一個裝飾器下面不是函數(shù)(裝飾器原則:下面必須是函數(shù),否則不執(zhí)行),所以第一個函數(shù)先等待,等第二個裝飾器執(zhí)行后形成函數(shù)在交給第一個裝飾器;所以運行結(jié)果是:
開始進行裝飾xx的功能,
開始進行裝飾權(quán)限1,
這是權(quán)限驗證1,
這是xx權(quán)限驗證,
——-test1——-,
——————裝飾器練習(xí)—————- 輸出格式:<td><h2>haha</h2></td>
def set_func_1(func): def call_func(): return ‘<h2>' + func() + '</h2>' return call_func ​ def set_func_2(func): def call_func(): return ‘<td>' + func() + '</td>' return call_func @set_func_1() @set_func_2() def get_str(): return ‘haha' print(get_str()) 最后執(zhí)行的效果: <h2><td>haha</td></h2>
6. 用類對函數(shù)進行裝飾(了解):
class Test(object): def __init__(self,func): self.func = fun def __call__(self): print(‘這里是裝飾器的功能。。。。') return self.func() @Test def get_str(): return ‘haha' print(get_str())
看完了這篇文章,相信你對關(guān)于Python閉包裝飾器的簡介有了一定的了解,想了解更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。