Python上下文管理器

2021-10-09 18:43:15 字數 2024 閱讀 2550

乙個類只要實現了__enter__()__exit__()這個兩個方法,通過該類建立的物件我們就稱之為上下文管理器。

上下文管理器可以使用 with 語句,with語句之所以這麼強大,背後是由上下文管理器做支撐的,也就是說剛才使用 open 函式建立的檔案物件就是就是乙個上下文管理器物件。

自定義上下文管理器類,模擬檔案操作:

定義乙個file類,實現__enter__()__exit__()方法,然後使用 with 語句來完成操作檔案, 示例**:

# 自定義上下文管理器類

class

file

(object):

def__init__

(self, file_name, file_mode)

: self.file_name = file_name

self.file_mode = file_mode

def__enter__

(self)

:# 上文方法,負責返回操作物件資源,比如:檔案物件,資料庫連線物件

self.

file

=open

(self.file_name, self.file_mode)

return self.

file

def__exit__

(self, exc_type, exc_val, exc_tb)

:# 下文方法,負責釋放物件資源,比如:關閉檔案,關閉資料庫連線物件

self.

file

.close(

)print

('over'

)# with語句 結合上下文管理器物件使用

with file(

'1.txt'

,'r'

)as f:

# content = f.read()

# print(content)

f.write(

'qqq'

)# 報錯,但是仍然執行了關閉連線操作

**說明:

假如想要讓乙個函式成為上下文管理器,python 還提供了乙個 @contextmanager 的裝飾器,更進一步簡化了上下文管理器的實現方式。通過 yield 將函式分割成兩部分,yield 上面的語句在__enter__方法中執行,yield 下面的語句在__exit__方法中執行,緊跟在 yield 後面的引數是函式的返回值。

from contextlib import contextmanager

# 加上裝飾器,那麼下面函式建立的物件就是乙個上下文管理器

@contextmanager

defmy_open

(file_name, file_mode)

:global

file

try:

file

=open

(file_name, file_mode)

# yield關鍵字之前的**可以認為是上文方法,負責返回操作物件資源

yield

file

except exception as e:

print

(e)finally

:# yield關鍵字後面的**可以認為是下文方法,負責釋放操作物件的資源

file

.close(

)print

('over'

)# 普通函式不能結合with語句使用

with my_open(

'1.txt'

,'r')as

file

:# content = file.read()

# print(content)

file

.write(

'1')

python 上下文管理器

上下文管理器允許你在有需要的時候,精確地分配和釋放資源。使用上下文管理器最廣泛的案例就是with語句了。想象下你有兩個需要結對執行的相關操作,然後還要在它們中間放置一段 上下文管理器就是專門讓你做這種事情的。舉個例子 with open some file w as opened file open...

python上下文管理器

上下文管理器是乙個包裝任意 塊的物件。上下文管理器保證進入上下文管理器時,每次 執行的一致性 當退出上下文管理器時,相關資源會被正確 這裡被正確 指的是在 exit 方法自定義 比如關閉資料庫游標 值得注意的是,上下文管理器一定能夠保證退出步驟的執行。如果進入上下文管理器,根據定義,一定會有退出步驟...

Python 上下文管理器

python中的上下文管理器是乙個包裝任意 塊的物件。它在處理資源的開啟關閉 異常的處理等方面有很好的實現方法。1.上下文管理器的語法 假設我們需要讀取乙個檔案中的資料,如下 try test file open test.txt r contents test file.read finally ...