Python中with的用法
阿新 • • 發佈:2021-12-20
上下文管理器
上下文管理器是指符合上下文協議的一個類(類中實現了__enter__方法和__exit__方法)。即可以在一段程式碼執行前,先執行__enter__中的程式碼用於預處理,執行完這段程式碼之後再執行__exit__中的程式碼進行清理工作。比如入棧、出棧,開啟資料庫、關閉資料庫,開啟檔案、關閉檔案等操作都可以用上下文管理器來完成。
上下文管理器格式
class A(): def __enter__(self): print('連線') return self def __exit__(self, exc_type, exc_val, exc_tb):print('斷開連線') if(exc_tb): print('出現異常') else: print('無異常') return True
- __enter__方法實現資源的連線過程
- __exit__方式實現了資源的斷開過程
with A() as b: # 相關操作程式碼放這裡 ------------------------- with A(): # 相關操作程式碼放這裡
- 在with語句中的操作程式碼執行前,先執行__enter__中的程式碼;操作程式碼執行完後,再執行__exit__中的程式碼
- __enter__=>with=>__exit__
相關引數
- 在 with A() as b 中,b的值為__enter__方法的返回值,一般情況下會寫self即返回上下文管理器物件本身,但是也可以返回其他內容
- __exit__方法中的引數除了self外還必須有exc_type,exc_val,exc_tb;當操作程式碼部分沒有出現異常時,三個引數的值都為空,當操作程式碼部分出現異常時分別傳入異常的型別、資訊、錯誤堆疊
- __exit__的返回值可以是True或False,當返回True時若操作程式碼出現異常則在with語句外將不會給出異常(在__exit__中處理異常),當返回False時若操作程式碼出現異常則在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('出現異常') else: print('無異常') return True with DataBase() as db: db.query() # 結果 # 連線資料庫 # 查詢資料庫 # 斷開資料庫連線 # 無異常