更新時間:2021-03-10 來源:黑馬程序員 瀏覽量:
with語句之所以能夠自動關(guān)閉資源,是因為它使用了一種名為上下文管理的技術(shù)管理資源。接下來,對上下文管理器的知識進(jìn)行介紹。
1.上下文管理協(xié)議(Context Manager Protocol)
上下文管理協(xié)議包括了__enter__()和__exit__()方法,支持該協(xié)議的對象均需要實現(xiàn)了這兩個方法。__enter__()和__exit__()方法的含義與用途如下所示:
__enter__(self):進(jìn)入上下文管理器時調(diào)用此方法,它的返回值被放入with-as語句as說明符指定的變量中。
__exit__(self, type, value, traceback):離開上下文管理器時調(diào)用此方法。在__exit__()方法中,參數(shù)type、value、traceback的含義分別為:異常的類型、異常值、異?;厮葑粉?。如果__exit__()方法內(nèi)部引發(fā)異常,該異常會覆蓋掉其執(zhí)行體中引發(fā)的異常。處理異常時不需要重新拋出異常,只需要返回False。
2.上下文管理器(Context Manager)
支持上下文管理協(xié)議的對象就是上下文管理器,這種對象實現(xiàn)了__enter__()和__exit__()方法。通過with語句即可調(diào)用上下文管理器,它負(fù)責(zé)建立運行時的上下文。
3.上下文表達(dá)式(Context Expression)
with語句中關(guān)鍵字with之后的表達(dá)式返回一個支持上下文管理協(xié)議的協(xié)議的對象,也就是返回一個上下文管理器。
4.運行時上下文
由上下文管理器創(chuàng)建,通過上下文管理器的__enter__()和__exit__()方法實現(xiàn)。__enter__()方法在語句體執(zhí)行之前執(zhí)行,__exit__()方法在語句體執(zhí)行之后執(zhí)行。
猜你喜歡