全國(guó)咨詢(xún)/投訴熱線(xiàn):400-618-4000

首頁(yè)常見(jiàn)問(wèn)題正文

Python培訓(xùn):上下文管理器

更新時(shí)間:2022-08-17 來(lái)源:黑馬程序員 瀏覽量:

IT培訓(xùn)班

  在前面介紹with語(yǔ)句時(shí),提到了一個(gè)非常重要的概念,即上下文管理器。要想使用with語(yǔ)句,前提就是要有上下文管理器。上下文管理器是Python2.5開(kāi)始支持的一種語(yǔ)法,用于規(guī)定某個(gè)對(duì)象的使用范圍,一旦進(jìn)入或者離開(kāi)使用范圍,會(huì)有特殊的操作被調(diào)用。

  下面來(lái)介紹與上下文管理器有關(guān)的概念。

  1.上下文管理協(xié)議

  包含_enter_()和_exit_()方法,支持該協(xié)議的對(duì)象要實(shí)現(xiàn)這兩個(gè)方法。關(guān)于這兩個(gè)方法的介紹如下。

  ·_enter_(self):進(jìn)入上下文管理器時(shí)調(diào)用此方法,其返回值被放入with-as語(yǔ)句中as說(shuō)明符指定的變量中。

  ·_exit_(self,type,value,tb):離開(kāi)上下文管理器調(diào)用此方法。如果有出現(xiàn)異常,type、value、tb分別為異常的類(lèi)型、值和追蹤信息;如果沒(méi)有異常,3個(gè)參數(shù)均設(shè)為None。此方法返回值為T(mén)rue或False,分別指示被引發(fā)的異常得到了還是沒(méi)有得到處理,如果返回False,引發(fā)的異常會(huì)被傳遞出上下文。

  2.上下文管理器

  支持上下文管理協(xié)議的對(duì)象,用于實(shí)現(xiàn)_enter_()和_exit_()方法。上下文管理器定義執(zhí)行with語(yǔ)句時(shí)要建立的運(yùn)行時(shí)上下文,負(fù)責(zé)執(zhí)行with語(yǔ)句塊上下文中的進(jìn)入與退出操作。

  3.運(yùn)行時(shí)上下文

  由上下文管理協(xié)議的對(duì)象,用于實(shí)現(xiàn)_enter_()和_exit_()方法實(shí)現(xiàn)。

  4.上下文表達(dá)式

  with語(yǔ)句中在關(guān)鍵字with之后的表達(dá)式,該表達(dá)式要返回一個(gè)支持上下文管理協(xié)議的對(duì)象。

  在了解上下文管理器之后,就能很好地理解with語(yǔ)句的整個(gè)執(zhí)行過(guò)程了,具體如下:

  (1)首先執(zhí)行上下文表達(dá)式,生成一個(gè)上下文管理器對(duì)象;

  (2)調(diào)用上下文管理器的_enter_()方法,如果使用了as子句,就把_enter_()方法的返回值賦值給as子句中的資源對(duì)象;

  (3)執(zhí)行with語(yǔ)句包裹的代碼塊;

  (4)無(wú)論在執(zhí)行的過(guò)程中是否發(fā)生異常,都會(huì)執(zhí)行上下文管理器的_exit_()方法。該方法負(fù)責(zé)執(zhí)行程序的“清理”工作,如釋放資源等;

  (5)如果執(zhí)行過(guò)程中沒(méi)有出現(xiàn)異常,或者代碼中執(zhí)行了break、continue或者return語(yǔ)句,則以None作為參數(shù)調(diào)用_exit_()方法,如果在執(zhí)行過(guò)程中出現(xiàn)異常,則會(huì)使用sys.exc_info得到的異常信息為參數(shù)調(diào)用_exit_()方法;

  (6)出現(xiàn)異常時(shí),如果_exit_()方法返回的結(jié)果為False,則會(huì)重新拋出異常,讓with之外的語(yǔ)句邏輯來(lái)處理異常,這是通用做法;如果返回True,則忽略異常,不再對(duì)異常進(jìn)行處理。

分享到:
在線(xiàn)咨詢(xún) 我要報(bào)名
和我們?cè)诰€(xiàn)交談!