淺談python的上下文管理器with的用法
如何理解上下文管理器, 那就是有先 有后, 中間是要處理的東西。
舉個例子: 別墅獨立小院, 是不是有個大門。每天進大門然后出大門(有先有后),中間呢 是你在這個小院里操作各種內容,比如打水。
上下文管理器指符合上下文協(xié)議的一個類,類中實現(xiàn)了__enter__方法 和 exit 方法。 在一段代碼執(zhí)行前, 先執(zhí)行__enter__中的代碼用于預處理,然后執(zhí)行 with 中間的代碼,最后執(zhí)行完這段代碼之后再執(zhí)行 exit 中的代碼進行清理工作。
常見的如:
文件的操作:打開文件,關閉文件
打開數據庫,關閉數據庫
入棧,出棧
都可以用上下文管理器來完成。
具體可以參考官網里這塊的代碼實現(xiàn)邏輯來加深理解。
上下文管理器格式:
class A(): def __enter__(self): print('連接') return self def __exit__(self, exc_type, exc_val, exc_tb): print('斷開連接') if(exc_tb): print('出現(xiàn)異常') else: print('無異常') return True
__enter__方法實現(xiàn)資源的連接過程 __exit__方式實現(xiàn)了資源的斷開過程
with語句基本結構
with A() as b: # 相關操作代碼放這里 ------------------------- with A(): # 相關操作代碼放這里
在with語句中的操作代碼執(zhí)行前,先執(zhí)行__enter__中的代碼;
操作代碼執(zhí)行完后,再執(zhí)行__exit__中的代碼 enter=>with=>exit
這段代碼里需要理解一下as b 在 with A() as b 中,b的值為__enter__方法的返回值,一般情況下會寫self即返回上下文管理器對象本身,但是也可以返回其他內容 __exit__方法中的參數除了self外還必須有exc_type,exc_val,exc_tb;
當操作代碼部分沒有出現(xiàn)異常時,三個參數的值都為空,當操作代碼部分出現(xiàn)異常時分別傳入異常的類型、信息、錯誤堆棧 __exit__的返回值可以是True或False,當返回True時若操作代碼出現(xiàn)異常則在with語句外將不會給出異常(在__exit__中處理異常),當返回False時若操作代碼出現(xiàn)異常則在with語句外給出異常(由外部處理異常)
舉個數據庫的簡單例子
class DataBase(): def query(self): print('查詢數據庫') def __enter__(self): print('連接數據庫') return self def __exit__(self, exc_type, exc_val, exc_tb): print('斷開數據庫連接') if(exc_tb): print('出現(xiàn)異常') else: print('無異常') return True with DataBase() as db: db.query()
到此這篇關于淺談python的上下文管理器with的用法的文章就介紹到這了,更多相關python上下文管理器with內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Tensorflow 自帶可視化Tensorboard使用方法(附項目代碼)
這篇文章主要介紹了Tensorflow 自帶可視化Tensorboard使用方法(附項目代碼),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-02-02