python裝飾器三種裝飾模式的簡單分析
學(xué)設(shè)計模式中有個裝飾模式,用java實(shí)現(xiàn)起來不是很難,但是遠(yuǎn)遠(yuǎn)沒有python簡單,難怪越來越火了!
這里就簡單討論下python的幾種裝飾模式:
一 無參裝飾器:
# 裝飾器 import time # 裝飾器,記錄函數(shù)運(yùn)行時間 def decorator01(fun): def wapper(): stime = time.time() fun() etime = time.time() print("fun run time is {TIME}".format(TIME=etime - stime)) return wapper # 必須要返回一個函數(shù)的內(nèi)存地址 # 使用裝飾器裝飾某個函數(shù),等價于 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ù)帶參裝飾器:
# 裝飾器 import time # 裝飾器,記錄函數(shù)運(yùn)行時間 def decorator01(fun): def wapper(*args, **kwargs): # 使用非固定參數(shù),無論參數(shù)是什么,都可以傳遞進(jìn)來 stime = time.time() fun(*args, **kwargs) etime = time.time() print("fun run time is {TIME}".format(TIME=etime - stime)) return wapper # 必須要返回一個函數(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ù)的裝飾器:
# 裝飾器 import time # 如果裝飾器有參數(shù),最外層是裝飾器的參數(shù) def decorator01(*args, **kwargs): print("裝飾器參數(shù):", *args, **kwargs) def out(fun): #第二層才是接受的函數(shù) def wapper(*args, **kwargs): # 使用非固定參數(shù),無論參數(shù)是什么,都可以傳遞進(jìn)來 stime = time.time() fun(*args, **kwargs) etime = time.time() print("fun run time is {TIME}".format(TIME=etime - stime)) return wapper # 必須要返回一個函數(shù)的內(nèi)存地址 return out # 要返回裝飾函數(shù)的內(nèi)存地址 # 裝飾器本身帶參數(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)添加記錄時間功能
這種一開始挺難理解的,但是只要記住一點(diǎn),@語法糖裝飾器的作用就是 給被裝飾的函數(shù)重新賦一個函數(shù)的內(nèi)存地址,即裝飾器內(nèi)部定義的那個
和你直接fun01=decorator(fun)
,然后 fun01()
是一樣的,只是這樣寫不用改變原來調(diào)用方式
@decorator
def fun():
即就是 fun=decorator(fun)
所以,當(dāng)裝飾器有參數(shù)時,還需要返回一個函數(shù),這個函數(shù)才是用來裝飾作用的, decorator(1)=out
, 即 fun=out(fun)
!!
所以外面再包一層就行了,其實(shí)就相當(dāng)于@decorator(1)=@out
,即 decorator(1)=out
,實(shí)際裝飾器時out,只不過decorator(1)
返回了一個out 這樣理解就簡單多了 ,無參的@就是起賦值作用
以上就是python裝飾器三種裝飾模式的簡單分析的詳細(xì)內(nèi)容,更多關(guān)于python 裝飾模式的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python數(shù)據(jù)結(jié)構(gòu)與算法的雙端隊列詳解
這篇文章主要為大家詳細(xì)介紹了Python的雙端隊列,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03Python使用virtualenv創(chuàng)建虛擬環(huán)境的詳細(xì)步驟
這篇文章主要介紹了Python使用virtualenv創(chuàng)建虛擬環(huán)境的詳細(xì)步驟,本文分步驟給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-05-05Python 類中引用其他類的實(shí)現(xiàn)示例
在Python中,類的引用是通過屬性或方法與其他類實(shí)例關(guān)聯(lián),實(shí)現(xiàn)復(fù)雜邏輯,本文介紹了關(guān)聯(lián)、組合等類之間的引用方式,具有一定的參考價值,感興趣的可以了解一下2024-09-09解決phantomjs截圖失敗,phantom.exit位置的問題
今天小編就為大家分享一篇解決phantomjs截圖失敗,phantom.exit位置的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05關(guān)于爬蟲中scrapy.Request的更多參數(shù)用法
這篇文章主要介紹了關(guān)于爬蟲中scrapy.Request的更多參數(shù)用法說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07解決pycharm 遠(yuǎn)程調(diào)試 上傳 helpers 卡住的問題
今天小編就為大家分享一篇解決pycharm 遠(yuǎn)程調(diào)試 上傳 helpers 卡住的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06python神經(jīng)網(wǎng)絡(luò)tensorflow利用訓(xùn)練好的模型進(jìn)行預(yù)測
這篇文章主要為大家介紹了python神經(jīng)網(wǎng)絡(luò)tensorflow利用訓(xùn)練好的模型進(jìn)行預(yù)測,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05