python的上下文管理器

2021-08-21 22:19:34 字數 1790 閱讀 3215

上下文管理器允許你在有需要的時候,精確地分配和釋放資源。

使用上下文管理器最廣泛的案例就是with語句了。

想象下你有兩個需要結對執行的相關操作,然後還要在它們中間放置一段**。

上下文管理器就是專門讓你做這種事情的。舉個例子:

with open('some_file', 'w') as opened_file:

opened_file.write('hola!')

上面這段**開啟了乙個檔案,往裡面寫入了一些資料,然後關閉該檔案。如果在往檔案寫資料時發生異常,它也會嘗試去關閉檔案。上面那段**與這一段是等價的:

file = open('some_file', 'w')

try:

file.write('hola!')

finally:

file.close()

當與第乙個例子對比時,我們可以看到,通過使用with,許多樣板**(boilerplate code)被消掉了。 這就是with語句的主要優勢,它確保我們的檔案會被關閉,而不用關注巢狀**如何退出。

上下文管理器的乙個常見用例,是資源的加鎖和解鎖,以及關閉已開啟的檔案(就像我已經展示給你看的)。

讓我們看看如何來實現我們自己的上下文管理器。這會讓我們更完全地理解在這些場景背後都發生著什麼。

乙個上下文管理器的類,最起碼要定義__enter____exit__方法。

讓我們來構造我們自己的開啟檔案的上下文管理器,並學習下基礎知識。

class file(object):

def __init__(self, file_name, method):

self.file_obj = open(file_name, method)

def __enter__(self):

return self.file_obj

def __exit__(self, type, value, traceback):

self.file_obj.close()

通過定義__enter____exit__方法,我們可以在with語句裡使用它。我們來試試:

with file('demo.txt', 'w') as opened_file:

opened_file.write('hola!')

我們的__exit__函式接受三個引數。這些引數對於每個上下文管理器類中的__exit__方法都是必須的。我們來談談在底層都發生了什麼。

with語句先暫存了file類的__exit__方法

然後它呼叫file類的__enter__方法

__enter__方法開啟檔案並返回給with語句

開啟的檔案控制代碼被傳遞給opened_file引數

我們使用.write()來寫檔案

with語句呼叫之前暫存的__exit__方法

__exit__方法關閉了檔案                                     

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