上下文管理器與 with 語句

打工人發表於2020-12-07

1、概念
上下文管理協議(Context Management Protocol):包含enter() 和exit() 方法,支援該協議的物件要實現這兩個方法
上下文管理器(Context Manager):支援上下文管理協議的物件
使用 with 語句呼叫上下文管理器,來構建對資源的自動建立和釋放
2、with 語句基本語法

with expression [as variable]:
    with-block

3、上下文管理器

class Context:

    def __enter__(self):
        print("enter方法")

    def __exit__(self, exc_type, exc_val, exc_tb):
        print("exit方法")


with Context() as c:
    print(c)

執行原理如下:
1、執行 Context(),返回一個上下文管理器物件
2、自動呼叫上下文管理器的enter方法,如果使用了 as 子句,則將enter() 方法的返回值賦值給 as 子句中的 c
3、執行 with 中的程式碼塊
4、不論執行過程中是否發生異常,都會執行上下文管理器中的exit() 方法,exit 方法負責清理工作。如果執行過程中沒有異常,則以 None 作為引數呼叫exit
如果執行過程中發生了異常,則使用exit(exc_type, exc_val, exc_tb) 呼叫

相關文章