淺談python的上下文管理器with的用法
如何理解上下文管理器, 那就是有先 有后, 中間是要處理的東西。
舉個(gè)例子: 別墅獨(dú)立小院, 是不是有個(gè)大門(mén)。每天進(jìn)大門(mén)然后出大門(mén)(有先有后),中間呢 是你在這個(gè)小院里操作各種內(nèi)容,比如打水。
上下文管理器指符合上下文協(xié)議的一個(gè)類(lèi),類(lèi)中實(shí)現(xiàn)了__enter__方法 和 exit 方法。 在一段代碼執(zhí)行前, 先執(zhí)行__enter__中的代碼用于預(yù)處理,然后執(zhí)行 with 中間的代碼,最后執(zhí)行完這段代碼之后再執(zhí)行 exit 中的代碼進(jìn)行清理工作。
常見(jiàn)的如:
文件的操作:打開(kāi)文件,關(guān)閉文件
打開(kāi)數(shù)據(jù)庫(kù),關(guān)閉數(shù)據(jù)庫(kù)
入棧,出棧
都可以用上下文管理器來(lái)完成。
具體可以參考官網(wǎng)里這塊的代碼實(shí)現(xiàn)邏輯來(lái)加深理解。
上下文管理器格式:
class A(): def __enter__(self): print('連接') return self def __exit__(self, exc_type, exc_val, exc_tb): print('斷開(kāi)連接') if(exc_tb): print('出現(xiàn)異常') else: print('無(wú)異常') return True
__enter__方法實(shí)現(xiàn)資源的連接過(guò)程 __exit__方式實(shí)現(xiàn)了資源的斷開(kāi)過(guò)程
with語(yǔ)句基本結(jié)構(gòu)
with A() as b: # 相關(guān)操作代碼放這里 ------------------------- with A(): # 相關(guān)操作代碼放這里
在with語(yǔ)句中的操作代碼執(zhí)行前,先執(zhí)行__enter__中的代碼;
操作代碼執(zhí)行完后,再執(zhí)行__exit__中的代碼 enter=>with=>exit
這段代碼里需要理解一下as b 在 with A() as b 中,b的值為_(kāi)_enter__方法的返回值,一般情況下會(huì)寫(xiě)self即返回上下文管理器對(duì)象本身,但是也可以返回其他內(nèi)容 __exit__方法中的參數(shù)除了self外還必須有exc_type,exc_val,exc_tb;
當(dāng)操作代碼部分沒(méi)有出現(xiàn)異常時(shí),三個(gè)參數(shù)的值都為空,當(dāng)操作代碼部分出現(xiàn)異常時(shí)分別傳入異常的類(lèi)型、信息、錯(cuò)誤堆棧 __exit__的返回值可以是True或False,當(dāng)返回True時(shí)若操作代碼出現(xiàn)異常則在with語(yǔ)句外將不會(huì)給出異常(在__exit__中處理異常),當(dāng)返回False時(shí)若操作代碼出現(xiàn)異常則在with語(yǔ)句外給出異常(由外部處理異常)
舉個(gè)數(shù)據(jù)庫(kù)的簡(jiǎn)單例子
class DataBase(): def query(self): print('查詢(xún)數(shù)據(jù)庫(kù)') def __enter__(self): print('連接數(shù)據(jù)庫(kù)') return self def __exit__(self, exc_type, exc_val, exc_tb): print('斷開(kāi)數(shù)據(jù)庫(kù)連接') if(exc_tb): print('出現(xiàn)異常') else: print('無(wú)異常') return True with DataBase() as db: db.query()
到此這篇關(guān)于淺談python的上下文管理器with的用法的文章就介紹到這了,更多相關(guān)python上下文管理器with內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python股票開(kāi)源庫(kù)akshare的具體使用
AKShare是一個(gè)開(kāi)源財(cái)經(jīng)數(shù)據(jù)接口庫(kù),本文主要介紹了Python股票開(kāi)源庫(kù)akshare的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下2024-04-04windows下python連接oracle數(shù)據(jù)庫(kù)
這篇文章主要為大家詳細(xì)介紹了windows下python連接oracle數(shù)據(jù)庫(kù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06MATLAB 全景圖切割及盒圖顯示的實(shí)現(xiàn)步驟
本文給大家分兩部分介紹,第一部分通過(guò)圖文的形式給大家介紹了全景圖切割的代碼,第二部分給大家介紹了盒圖展示效果的實(shí)現(xiàn)代碼,對(duì)MATLAB 全景圖切割相關(guān)知識(shí)感興趣的朋友,跟隨小編一起看看吧2021-05-05python如何獲取網(wǎng)絡(luò)數(shù)據(jù)
這篇文章主要介紹了python如何獲取網(wǎng)絡(luò)數(shù)據(jù),幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-04-04Tensorflow 自帶可視化Tensorboard使用方法(附項(xiàng)目代碼)
這篇文章主要介紹了Tensorflow 自帶可視化Tensorboard使用方法(附項(xiàng)目代碼),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-02-02python 數(shù)字轉(zhuǎn)換為日期的三種實(shí)現(xiàn)方法
在Python中,我們經(jīng)常需要處理日期和時(shí)間,本文主要介紹了python 數(shù)字轉(zhuǎn)換為日期的三種實(shí)現(xiàn)方法,包含datetime模塊,strftime方法及pandas庫(kù),具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02