python裝飾器三種裝飾模式的簡(jiǎn)單分析
學(xué)設(shè)計(jì)模式中有個(gè)裝飾模式,用java實(shí)現(xiàn)起來(lái)不是很難,但是遠(yuǎn)遠(yuǎn)沒(méi)有python簡(jiǎn)單,難怪越來(lái)越火了!
這里就簡(jiǎn)單討論下python的幾種裝飾模式:
一 無(wú)參裝飾器:
# 裝飾器
import time
# 裝飾器,記錄函數(shù)運(yùn)行時(shí)間
def decorator01(fun):
def wapper():
stime = time.time()
fun()
etime = time.time()
print("fun run time is {TIME}".format(TIME=etime - stime))
return wapper # 必須要返回一個(gè)函數(shù)的內(nèi)存地址
# 使用裝飾器裝飾某個(gè)函數(shù),等價(jià)于 test01=decorator01(test01),
# 即將test01實(shí)際引用變成wapper函數(shù)內(nèi)存地址,所以執(zhí)行test01實(shí)際是執(zhí)行wapper
@decorator01
def test01():
time.sleep(2)
print("test01 is running")
test01() # 不修改代碼和調(diào)用方式,實(shí)現(xiàn)添加記錄時(shí)間功能
二 函數(shù)帶參裝飾器:
# 裝飾器
import time
# 裝飾器,記錄函數(shù)運(yùn)行時(shí)間
def decorator01(fun):
def wapper(*args, **kwargs): # 使用非固定參數(shù),無(wú)論參數(shù)是什么,都可以傳遞進(jìn)來(lái)
stime = time.time()
fun(*args, **kwargs)
etime = time.time()
print("fun run time is {TIME}".format(TIME=etime - stime))
return wapper # 必須要返回一個(gè)函數(shù)的內(nèi)存地址
# test01() = wapper(), 所以裝飾器加參數(shù)是給嵌套函數(shù)加參數(shù)
@decorator01
def test01(args1):
time.sleep(2)
print("參數(shù)是 {NAME} ".format(NAME=args1))
test01("侯征") # 不修改代碼和調(diào)用方式,實(shí)現(xiàn)添加記錄時(shí)間功能
三 裝飾器本身帶參數(shù)的裝飾器:
# 裝飾器
import time
# 如果裝飾器有參數(shù),最外層是裝飾器的參數(shù)
def decorator01(*args, **kwargs):
print("裝飾器參數(shù):", *args, **kwargs)
def out(fun): #第二層才是接受的函數(shù)
def wapper(*args, **kwargs): # 使用非固定參數(shù),無(wú)論參數(shù)是什么,都可以傳遞進(jìn)來(lái)
stime = time.time()
fun(*args, **kwargs)
etime = time.time()
print("fun run time is {TIME}".format(TIME=etime - stime))
return wapper # 必須要返回一個(gè)函數(shù)的內(nèi)存地址
return out # 要返回裝飾函數(shù)的內(nèi)存地址
# 裝飾器本身帶參數(shù),此時(shí) decorator01(arg)=out,即相當(dāng)于 @out裝飾test01,所以 test01=out(fun)=wapper
@decorator01(1)
def test01(args1):
time.sleep(2)
print("參數(shù)是 {NAME} ".format(NAME=args1))
test01("侯征") # 不修改代碼和調(diào)用方式,實(shí)現(xiàn)添加記錄時(shí)間功能
這種一開(kāi)始挺難理解的,但是只要記住一點(diǎn),@語(yǔ)法糖裝飾器的作用就是 給被裝飾的函數(shù)重新賦一個(gè)函數(shù)的內(nèi)存地址,即裝飾器內(nèi)部定義的那個(gè)
和你直接fun01=decorator(fun),然后 fun01()是一樣的,只是這樣寫(xiě)不用改變?cè)瓉?lái)調(diào)用方式
@decorator
def fun():
即就是 fun=decorator(fun) 所以,當(dāng)裝飾器有參數(shù)時(shí),還需要返回一個(gè)函數(shù),這個(gè)函數(shù)才是用來(lái)裝飾作用的, decorator(1)=out, 即 fun=out(fun) !!
所以外面再包一層就行了,其實(shí)就相當(dāng)于@decorator(1)=@out,即 decorator(1)=out ,實(shí)際裝飾器時(shí)out,只不過(guò)decorator(1)返回了一個(gè)out 這樣理解就簡(jiǎn)單多了 ,無(wú)參的@就是起賦值作用
以上就是python裝飾器三種裝飾模式的簡(jiǎn)單分析的詳細(xì)內(nèi)容,更多關(guān)于python 裝飾模式的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
kafka-python批量發(fā)送數(shù)據(jù)的實(shí)例
今天小編就為大家分享一篇kafka-python批量發(fā)送數(shù)據(jù)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
Python生成器實(shí)現(xiàn)簡(jiǎn)單"生產(chǎn)者消費(fèi)者"模型代碼實(shí)例
這篇文章主要介紹了Python生成器實(shí)現(xiàn)簡(jiǎn)單"生產(chǎn)者消費(fèi)者"模型代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03
基于virtualenv創(chuàng)建python虛擬環(huán)境過(guò)程圖解
這篇文章主要介紹了基于virtualenv創(chuàng)建python虛擬環(huán)境過(guò)程圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03
JupyterNotebook 輸出窗口的顯示效果調(diào)整方法
這篇文章主要介紹了JupyterNotebook 輸出窗口的顯示效果調(diào)整方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04
python基礎(chǔ)while循環(huán)及if判斷的實(shí)例講解
下面小編就為大家?guī)?lái)一篇python基礎(chǔ)while循環(huán)及if判斷的實(shí)例講解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08
PyInstaller將Python文件打包為exe后如何反編譯(破解源碼)以及防止反編譯
這篇文章主要介紹了PyInstaller將Python文件打包為exe后如何反編譯(破解源碼)以及防止反編譯,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04

