上下文管理器允許你在有需要的時候,精確地分配和釋放資源。
使用上下文管理器最廣泛的案例就是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 ...