python中@contextmanager裝飾器的用法詳解
@contextmanager 的作用就是我們可以把一個非自定義類改成一個上下文管理器。
這個會經(jīng)常遇到,所以有必要理解一下。
上下文管理器 是有 enter__和__exit ,那么我們可以為需要改寫的普通類創(chuàng)建一個子類,在其中添加上__enter__和__exit__方法通過繼承父類的方式實現(xiàn)上下文管理器。
但是通過contextlib模塊下提供的@contextmanager裝飾器,我們能夠更方便的將一個普通類變成上下文管理器。
@contextmanager通過將一個函數(shù)變成生成器的方式來為普通類添加進入和退出時的處理代碼,從而實現(xiàn)了將普通類變成一個上下文管理器。
還是拿文件來舉個例子 # 結(jié)果 打開文件 查詢文件 關(guān)閉文件
from contextlib import contextmanager class File(): def query(self): print('查詢文件') @contextmanager def open(): print('打開文件') yield File() print('關(guān)閉文件') with open() as f: f.query()
執(zhí)行的順序:
①with語句調(diào)用open函數(shù)=>②執(zhí)行open中yield之前的代碼(打開文件)=>③執(zhí)行yield語句中的代碼(File())=>④執(zhí)行with語句中的代碼(f.query)=>⑤執(zhí)行yiled語句后的代碼(關(guān)閉文件)
注意:
- 此時的with語句后是調(diào)用被修飾的函數(shù),而不是實例化上下文管理器對象
- with open() as f 中的f是yield語句中的內(nèi)容,上述示例中即所創(chuàng)建的File對象
- yield前、中、后的代碼都可以省略不寫
栗子2:
from contextlib import contextmanager class DataBase(): def query(self): print('寫入操作') @contextmanager def open(self): try: yield self.commit() except Exception as e: self.rollback() raise e db = DataBase() with db.open(): db.query()
重點理解執(zhí)行順序 ①with語句調(diào)用open函數(shù)=>②執(zhí)行try異常判斷=>③執(zhí)行with語句中的寫入操作=>④執(zhí)行數(shù)據(jù)庫的提交操作=>⑤如果出現(xiàn)異常執(zhí)行數(shù)據(jù)庫回滾操作
小結(jié):
1.在思考過程中我們可以假設(shè)with語句中的內(nèi)容整體移到了yield語句后,從而將with語句的執(zhí)行簡化為@contextmanager所修飾的函數(shù)的執(zhí)行
2.當我們需要在一段代碼的執(zhí)行前后加上其他的處理代碼時都可以使用@contextmanager來完成,并不需要一定是對上下文管理器的操作
到此這篇關(guān)于python中@contextmanager裝飾器的用法詳解的文章就介紹到這了,更多相關(guān)python的@contextmanager裝飾器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python+requests接口壓力測試500次,查看響應(yīng)時間的實例
這篇文章主要介紹了python+requests接口壓力測試500次,查看響應(yīng)時間的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04Django rest framework工具包簡單用法示例
這篇文章主要介紹了Django rest framework工具包簡單用法,結(jié)合匿名訪問控制的具體實例分析了Django rest framework工具包的注冊、路由設(shè)置、視圖、權(quán)限控制、配置等相關(guān)操作技巧,需要的朋友可以參考下2018-07-07Python批量上傳文件信息到服務(wù)器的實現(xiàn)示例
在進行軟件測試的過程中,經(jīng)常會需要準備一批數(shù)據(jù),本文主要介紹了Python批量上傳文件信息到服務(wù)器的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下2023-12-12Python中ArcPy柵格裁剪柵格(批量對齊柵格圖像范圍并統(tǒng)一行數(shù)與列數(shù))
本文介紹基于Python中ArcPy模塊,實現(xiàn)基于柵格圖像批量裁剪柵格圖像,同時對齊各個柵格圖像的空間范圍,統(tǒng)一其各自行數(shù)與列數(shù)的方法,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2023-02-02Pytorch從0實現(xiàn)Transformer的實踐
本文主要介紹了Pytorch從0實現(xiàn)Transformer的實踐,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-05-05