python裝飾器三種裝飾模式的簡單分析
學設計模式中有個裝飾模式,用java實現(xiàn)起來不是很難,但是遠遠沒有python簡單,難怪越來越火了!
這里就簡單討論下python的幾種裝飾模式:
一 無參裝飾器:
# 裝飾器import time # 裝飾器,記錄函數(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 # 必須要返回一個函數(shù)的內存地址 # 使用裝飾器裝飾某個函數(shù),等價于 test01=decorator01(test01),# 即將test01實際引用變成wapper函數(shù)內存地址,所以執(zhí)行test01實際是執(zhí)行wapper@decorator01def test01(): time.sleep(2) print('test01 is running') test01() # 不修改代碼和調用方式,實現(xiàn)添加記錄時間功能
二 函數(shù)帶參裝飾器:
# 裝飾器import time # 裝飾器,記錄函數(shù)運行時間def decorator01(fun): def wapper(*args, **kwargs): # 使用非固定參數(shù),無論參數(shù)是什么,都可以傳遞進來 stime = time.time() fun(*args, **kwargs) etime = time.time() print('fun run time is {TIME}'.format(TIME=etime - stime)) return wapper # 必須要返回一個函數(shù)的內存地址 # test01() = wapper(), 所以裝飾器加參數(shù)是給嵌套函數(shù)加參數(shù)@decorator01def test01(args1): time.sleep(2) print('參數(shù)是 {NAME} '.format(NAME=args1)) test01('侯征') # 不修改代碼和調用方式,實現(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ù)是什么,都可以傳遞進來 stime = time.time() fun(*args, **kwargs) etime = time.time() print('fun run time is {TIME}'.format(TIME=etime - stime)) return wapper # 必須要返回一個函數(shù)的內存地址 return out # 要返回裝飾函數(shù)的內存地址 # 裝飾器本身帶參數(shù),此時 decorator01(arg)=out,即相當于 @out裝飾test01,所以 test01=out(fun)=wapper@decorator01(1)def test01(args1): time.sleep(2) print('參數(shù)是 {NAME} '.format(NAME=args1)) test01('侯征') # 不修改代碼和調用方式,實現(xiàn)添加記錄時間功能
這種一開始挺難理解的,但是只要記住一點,@語法糖裝飾器的作用就是 給被裝飾的函數(shù)重新賦一個函數(shù)的內存地址,即裝飾器內部定義的那個
和你直接fun01=decorator(fun),然后 fun01()是一樣的,只是這樣寫不用改變原來調用方式
@decorator
def fun():
即就是 fun=decorator(fun) 所以,當裝飾器有參數(shù)時,還需要返回一個函數(shù),這個函數(shù)才是用來裝飾作用的, decorator(1)=out, 即 fun=out(fun) !!
所以外面再包一層就行了,其實就相當于@decorator(1)=@out,即 decorator(1)=out ,實際裝飾器時out,只不過decorator(1)返回了一個out 這樣理解就簡單多了 ,無參的@就是起賦值作用
以上就是python裝飾器三種裝飾模式的簡單分析的詳細內容,更多關于python 裝飾模式的資料請關注好吧啦網其它相關文章!
相關文章:
1. 完美解決vue 中多個echarts圖表自適應的問題2. Java GZip 基于內存實現(xiàn)壓縮和解壓的方法3. 利用CSS制作3D動畫4. 存儲于xml中需要的HTML轉義代碼5. Springboot 全局日期格式化處理的實現(xiàn)6. jsp+servlet簡單實現(xiàn)上傳文件功能(保存目錄改進)7. Python的文本常量與字符串模板之string庫8. .Net加密神器Eazfuscator.NET?2023.2?最新版使用教程9. SpringBoot+TestNG單元測試的實現(xiàn)10. JAMon(Java Application Monitor)備忘記