python 上下文管理器

2021-08-29 15:47:17 字數 1642 閱讀 4924

###上下文管理器

上下文管理器本質就是能夠支援with操作。

任何實現了enter() 和exit() 方法的物件都可稱之為上下文管理器,上下文管理器物件可以使用 with 關鍵字。顯然,檔案(file)物件也實現了上下文管理器協議。

那麼檔案物件是如何實現這兩個方法的呢?我們可以模擬實現乙個自己的檔案類,讓該類實現enter() 和exit() 方法

class file():

def __init__(self, filename, mode):

self.filename = filename

self.mode = mode

def __enter__(self):

print("entering")

self.f = open(self.filename, self.mode)

return self.f

def __exit__(self, *args):

print("will exit")

self.f.close()

方法enter() 返回資源物件,這裡就是你將要開啟的那個檔案物件,exit() 方法處理一些清除工作。

因為 file 類實現了上下文管理器,現在就可以使用 with 語句了

with file('out.txt', 'w') as f:

print("writing")

f.write('hello, python')

這樣,你就無需顯示地呼叫 close 方法了,由系統自動去呼叫,哪怕中間遇到異常 close 方法也會被呼叫

###實現上下文管理器的另外方式

python 還提供了乙個 contextmanager 的裝飾器,更進一步簡化了上下文管理器的實現方式。通過 yield 將函式分割成兩部分,yield 之前的語句在enter方法中執行,yield 之後的語句在exit方法中執行。緊跟在 yield 後面的值是函式的返回值。

第二種方式需要使用@contextlib裝飾器

from contextlib import contextmanager

@contextmanager

def my_open(path, mode):

f = open(path, mode)

yield f

f.close()

with my_open('out.txt', 'w') as f:

f.write("hello , the ******st context manager")

###總結

python 提供了 with 語法用於簡化資源操作的後續清除操作,實現原理建立在上下文管理器協議(實現__enter__和__exit__)之上

with使用**中如果在開啟過程中發生異常,需要使用try-except進行捕獲

python 還提供了乙個 contextmanager 裝飾器,更進一步簡化上下管理器的實現方式

參考:

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 ...