1. 程式人生 > 其它 >Python中with的用法

Python中with的用法

上下文管理器

  上下文管理器是指符合上下文協議的一個類(類中實現了__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()
# 結果
# 連線資料庫
# 查詢資料庫
# 斷開資料庫連線
# 無異常