Python閉包裝飾器使用方法匯總
閉包內(nèi)容:
匿名函數(shù):能夠完成簡(jiǎn)單的功能,傳遞這個(gè)函數(shù)的引用,只有功能
普通函數(shù):能夠完成復(fù)雜的功能,傳遞這個(gè)函數(shù)的引用,只有功能
閉包:能夠完成較為復(fù)雜的功能,傳遞這個(gè)閉包中的函數(shù)以及數(shù)據(jù),因此傳遞是功能+數(shù)據(jù)
對(duì)象:能夠完成最復(fù)雜的功能,傳遞很多數(shù)據(jù)+很多功能,因此傳遞的是數(shù)據(jù)+功能
———————————————————
對(duì)全局函數(shù)進(jìn)行修改:在函數(shù)當(dāng)中加global,在閉包中外邊中的變量加nonlocal
閉包定義:有兩個(gè)函數(shù)嵌套使用,里面的函數(shù)可以使用外面函數(shù)所傳輸?shù)膮?shù),最后可傳遞的是里面函數(shù)的結(jié)構(gòu)與數(shù)據(jù)(個(gè)人理解)。
最后閉包可以在python中引申出裝飾器 ———————————————————
def closure():
# 在函數(shù)內(nèi)部再定義一個(gè)函數(shù),
# 并且這個(gè)函數(shù)用到了外邊函數(shù)的變量,那么將這個(gè)函數(shù)以及用到的一些變量稱之為閉包
def closure_in(x):
print('---------我是打不死的%s--------' %x)
return closure_in
x = closure()
x('小強(qiáng)')
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,'小強(qiáng)',3) #傳closure_1函數(shù)
demo(4) #傳clsure_on函數(shù)
#注:函數(shù)不加括號(hào),調(diào)用的是函數(shù)本身【function】;函數(shù)加括號(hào),調(diào)用的是函數(shù)的return結(jié)果。
裝飾器內(nèi)容:
代碼要遵守‘開(kāi)放封閉'原則;對(duì)已經(jīng)寫(xiě)好的函數(shù)遵守封閉,對(duì)功能擴(kuò)展遵守開(kāi)放;
# 裝飾器的作用:為了對(duì)原來(lái)的代碼上進(jìn)行擴(kuò)展
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()
使用裝飾器來(lái)測(cè)試一個(gè)函數(shù)的運(yùn)行時(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()
#等價(jià)于:
@set_func==test1 = set_func(test1)
1. 沒(méi)有參數(shù),沒(méi)有返回值的函數(shù)進(jìn)行裝飾:
def set_func(func):
def call_func():
print(‘———test2——-')
print(‘———-test3——')
func()
return call_func
@set_func
def test1():
print(‘——test1——- ')
2. 對(duì)有參數(shù)無(wú)返回值的函數(shù)進(jìn)行裝飾:
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. 不定長(zhǎng)參數(shù)的函數(shù)裝飾:
def set_func(func):
def call_func(*args,**kwargs): #變
print(‘———test2——-')
print(‘———-test3——')
func(*args,**kwargs) #(拆包)將元祖拆開(kāi),每個(gè)進(jìn)行傳輸;
#func(args,kwargs)—>不行,相當(dāng)于傳遞了兩個(gè)參數(shù):一個(gè)元祖,一個(gè)字典。
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保存不定長(zhǎng)參數(shù),以元祖保存,**kwargs保存字典形式(mm=...)
4.對(duì)應(yīng)的返回值參數(shù)進(jìn)行裝飾、通用裝飾器:
#通用裝飾器
def set_func(func):
print(“開(kāi)始進(jìn)行裝飾———-”)
def call_func(*args,**kwargs): #變
print(‘———test2——-')
print(‘———-test3——')
return func(*args,**kwargs) #(拆包)將元祖拆開(kāi),每個(gè)進(jìn)行傳輸;如果沒(méi)有return ret返回none。
#func(args,kwargs)—>不行,相當(dāng)于傳遞了兩個(gè)參數(shù):一個(gè)元祖,一個(gè)字典。
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. 多個(gè)裝飾器對(duì)同一個(gè)函數(shù)進(jìn)行裝飾:
def add_qx(func):
print(“——開(kāi)始進(jìn)行裝飾權(quán)限1———-”)
def call_func(*args,**kwargs): #變
print(‘這是權(quán)限驗(yàn)證1')
return func(*args,**kwargs)
return call_func
def add_xx(func):
print(“——開(kāi)始進(jìn)行裝飾xx功能———-”)
def call_func(*args,**kwargs): #變
print(‘這是xx權(quán)限驗(yàn)證')
return func(*args,**kwargs)
return call_func
@add_qx
@add_xx
def test1():
print(‘——test1——-')
test1()
首先執(zhí)行第一個(gè),但是第一個(gè)裝飾器下面不是函數(shù)(裝飾器原則:下面必須是函數(shù),否則不執(zhí)行),所以第一個(gè)函數(shù)先等待,等第二個(gè)裝飾器執(zhí)行后形成函數(shù)在交給第一個(gè)裝飾器;所以運(yùn)行結(jié)果是:
開(kāi)始進(jìn)行裝飾xx的功能,
開(kāi)始進(jìn)行裝飾權(quán)限1,
這是權(quán)限驗(yàn)證1,
這是xx權(quán)限驗(yàn)證,
——-test1——-,
——————裝飾器練習(xí)—————- 輸出格式:<td><h1>haha</h1></td>
def set_func_1(func):
def call_func():
return ‘<h1>' + func() + '</h1>'
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í)行的效果: <h1><td>haha</td></h1>
6. 用類(lèi)對(duì)函數(shù)進(jìn)行裝飾(了解):
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())
以上就是裝飾器與閉包的全部?jī)?nèi)容
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于python中導(dǎo)入文件到list的問(wèn)題
這篇文章主要介紹了關(guān)于python中導(dǎo)入文件到list的問(wèn)題,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10
關(guān)于python列表相關(guān)知識(shí)點(diǎn)
這篇文章主要介紹了關(guān)于python列表相關(guān)知識(shí)點(diǎn),變量可以存儲(chǔ)一個(gè)元素,而列表是一個(gè)大容器,可以存儲(chǔ)N多個(gè)元素,程序可以方便的對(duì)這些數(shù)據(jù)進(jìn)行整體操作,需要的朋友可以參考下2023-04-04
Python3 字典dictionary入門(mén)基礎(chǔ)附實(shí)例
Python字典是另一種可變?nèi)萜髂P?,且可存?chǔ)任意類(lèi)型對(duì)象,如字符串、數(shù)字、元組等其他容器模型,字典由鍵和對(duì)應(yīng)值成對(duì)組成,字典也被稱作關(guān)聯(lián)數(shù)組或哈希表2020-02-02
python實(shí)現(xiàn)讀取并顯示圖片的兩種方法
本篇文章主要介紹python實(shí)現(xiàn)讀取并顯示圖片的兩種方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01
使用Python測(cè)試Ping主機(jī)IP和某端口是否開(kāi)放的實(shí)例
今天小編就為大家分享一篇使用Python測(cè)試Ping主機(jī)IP和某端口是否開(kāi)放的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12
Python高級(jí)特性之閉包與裝飾器實(shí)例詳解
這篇文章主要介紹了Python高級(jí)特性之閉包與裝飾器,結(jié)合實(shí)例形式詳細(xì)分析了Python閉包與裝飾器的相關(guān)原理、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-11-11

