Python之上下文管理器

2021-08-28 07:20:25 字數 1672 閱讀 2469

以下文章總結自《head first python》讀書筆記

從python處理乙個檔案說起,在python中開啟乙個檔案時,一般的**邏輯如下:

file = open('test.txt')

for line in file:

print(line)

file.close()

以上**主要做了3件事:1)開啟乙個檔案;2)處理檔案,讀取每一行並列印出來;3)關閉檔案

with open('test.txt') as file:

for line in file:

print(line, end='')

明顯的區別是,**簡潔了,沒有close呼叫,這是通過with語句來實現的,只要它的**組結束,就會自動呼叫close。這樣做有效的避免了程式設計師處理完檔案後忘記使用close。尤其如果是寫檔案的時候,如果忘記呼叫close可能會導致資料丟失或破壞。

而with語句就是乙個python內建的上下文管理器。with語句負責管理其**組執行的上下文。

首先,前面提到了with是乙個內建的上下文管理器(標準庫中也支援建立簡單的上下文管理器,使用contextlib模組),如果要使用with控制某個外部變數(比如開啟檔案),一般要建立乙個遵循上下文管理協議的類

協議指出,建立的類必須至少定義兩個方法:__enter__和__exit__。這就是協議,如果類遵循這個協議,就可以掛接到with語句。

乙個物件用於with語句時,在with語句的**組開始之前,直譯器會呼叫這個物件的__enter__方法。這樣就可以在__enter__中執行必要的建立**。

同時enter可以(但不是必須)向with語句返回乙個值

一旦with語句的**組結束,直譯器就會呼叫這個物件的__exit__方法。可以在exit方法中編輯對應的清理**。

由於with語句的**組有可能執行失敗,exit方法必須在發生這種情況時進行處理。

除了上述提到的enter和exit, 還可以根據需要為類增加其他方法,包括定義自己的__init__。如需要建立此方法,可以將初始化活動和建立活動分離。

定義__init__允許完成額外的物件初始化。init在enter之前執行。

為了掛接with語句,上下文管理協議需要建立乙個提供以下內容的類:

1)__init__方法,來完成初始化(如果需要)

2) __enter__方法, 來完成所有建立工作

3) __exit__方法,來完成所有清理工作。

再回過頭看之前開啟檔案的例子:

with open('test.txt') as file:

for line in file:

print(line, end='')

1)直譯器遇到with語句時,首先呼叫與open(有乙個py檔案,定義了乙個類,類名為open,包含init,enter,exit方法)呼叫關聯的__init__

2)  一旦init執行,直譯器會呼叫enter來確保呼叫open的結果會賦給file變數。

3)with語句結束時,直譯器會呼叫__exit__來完成清理,會確保開啟的檔案關閉,然後才繼續。

python 之 上下文管理器

首先說一下什麼叫上下文管理器 在python中任何實現了 enter 和 exit 方法的物件都可稱之為上下文管理器,上下文管理器物件可以使用 with 關鍵字 我們可以模擬實現乙個類,讓該類實現 enter 和 exit 方法 class file def init self,filename,m...

Python之上下文管理器物件

在學習python的過程中,經常會用到with語句,比如在進行檔案操作時,會使用下面這樣的語法 with open 1.txt r as f print f.read 這裡就會產生乙個疑問 f是不是就是open 函式的返回值呢?其實並不是,這裡涉及到上下文管理器方面的知識,先來解釋一下什麼是上下文管...

python之上下文管理器 with語句詳解

上下文管理器 一 基本語法with expr as var pass 以最常用的with為例 操作文字物件的時候,幾乎所有的人都會讓我們要用with open,這就是乙個上下文管理器的一種。比如 with open 1.txt as f print f.readllines 輸出結果 print t...