淺談python的上下文管理器with的用法
如何理解上下文管理器, 那就是有先 有后, 中間是要處理的東西。
舉個(gè)例子: 別墅獨(dú)立小院, 是不是有個(gè)大門。每天進(jìn)大門然后出大門(有先有后),中間呢 是你在這個(gè)小院里操作各種內(nèi)容,比如打水。
上下文管理器指符合上下文協(xié)議的一個(gè)類,類中實(shí)現(xiàn)了__enter__方法 和 exit 方法。 在一段代碼執(zhí)行前, 先執(zhí)行__enter__中的代碼用于預(yù)處理,然后執(zhí)行 with 中間的代碼,最后執(zhí)行完這段代碼之后再執(zhí)行 exit 中的代碼進(jìn)行清理工作。
常見的如:
文件的操作:打開文件,關(guān)閉文件
打開數(shù)據(jù)庫,關(guān)閉數(shù)據(jù)庫
入棧,出棧
都可以用上下文管理器來完成。
具體可以參考官網(wǎng)里這塊的代碼實(shí)現(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__方法實(shí)現(xiàn)資源的連接過程 __exit__方式實(shí)現(xiàn)了資源的斷開過程
with語句基本結(jié)構(gòu)
with A() as b:
# 相關(guān)操作代碼放這里
-------------------------
with A():
# 相關(guān)操作代碼放這里在with語句中的操作代碼執(zhí)行前,先執(zhí)行__enter__中的代碼;
操作代碼執(zhí)行完后,再執(zhí)行__exit__中的代碼 enter=>with=>exit
這段代碼里需要理解一下as b 在 with A() as b 中,b的值為__enter__方法的返回值,一般情況下會寫self即返回上下文管理器對象本身,但是也可以返回其他內(nèi)容 __exit__方法中的參數(shù)除了self外還必須有exc_type,exc_val,exc_tb;
當(dāng)操作代碼部分沒有出現(xiàn)異常時(shí),三個(gè)參數(shù)的值都為空,當(dāng)操作代碼部分出現(xiàn)異常時(shí)分別傳入異常的類型、信息、錯(cuò)誤堆棧 __exit__的返回值可以是True或False,當(dāng)返回True時(shí)若操作代碼出現(xiàn)異常則在with語句外將不會給出異常(在__exit__中處理異常),當(dāng)返回False時(shí)若操作代碼出現(xiàn)異常則在with語句外給出異常(由外部處理異常)
舉個(gè)數(shù)據(jù)庫的簡單例子
class DataBase():
def query(self):
print('查詢數(shù)據(jù)庫')
def __enter__(self):
print('連接數(shù)據(jù)庫')
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print('斷開數(shù)據(jù)庫連接')
if(exc_tb):
print('出現(xiàn)異常')
else:
print('無異常')
return True
with DataBase() as db:
db.query()
到此這篇關(guān)于淺談python的上下文管理器with的用法的文章就介紹到這了,更多相關(guān)python上下文管理器with內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python?如何將?matplotlib?圖表集成進(jìn)到PDF?中
這篇文章主要介紹了Python?如何將?matplotlib?圖表集成進(jìn)到PDF?中,文章介紹內(nèi)容詳細(xì),具有一定的參考價(jià)值,需要的小伙伴可以參考一下,希望對你的學(xué)習(xí)有所幫助2022-03-03
python中字符串變二維數(shù)組的實(shí)例講解
下面小編就為大家分享一篇python中字符串變二維數(shù)組的實(shí)例講解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04
python部署chineseocr_lite的實(shí)現(xiàn)示例
本文主要介紹了python部署chineseocr_lite的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
Python中實(shí)現(xiàn)從目錄中過濾出指定文件類型的文件
這篇文章主要介紹了Python中實(shí)現(xiàn)從目錄中過濾出指定文件類型的文件,本文是一篇學(xué)筆記,實(shí)例相對簡單,需要的朋友可以參考下2015-02-02
Kears+Opencv實(shí)現(xiàn)簡單人臉識別
這篇文章主要為大家詳細(xì)介紹了Kears+Opencv實(shí)現(xiàn)簡單人臉識別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08
Python API 自動(dòng)化實(shí)戰(zhàn)詳解(純代碼)
今天小編就為大家分享一篇Python API 自動(dòng)化實(shí)戰(zhàn)詳解(純代碼),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06

