我們在寫作的時候,經常會遇到需要管理資源的情況,比如開啟和關閉檔案,如果遇到一些異常,就需要關閉資源,否則會導致資源洩露,雖然我們可以手動關閉,但是如果有多個異常需要考慮,萬一不小心漏掉了乙個, 這將是芭比娃娃Q。 所以,如果有一種更優雅的方法來處理資源洩漏,那就太好了。 正是在這種背景下,Context Manager 誕生了。
上下文管理器是 Python 中的乙個物件,用於管理資源、執行特定操作和處理異常。 上下文管理器實現特定方法,使它們在 with 語句中可用,以確保正確獲取和釋放資源。
在 Python 中,上下文管理器通常使用類中的特殊方法實現,輸入和退出。 具體說來:
1. enter 方法在進入 with 語句塊時呼叫,通常用於獲取資源或執行一些初始化操作,一般返回 manager 物件。
2.退出方法在離開with塊時呼叫,無論**塊是否發生異常,都會執行該方法。 此方法通常用於釋放資源、清理工作和處理異常。 release 方法中有三個引數:異常型別、異常例項物件和異常堆疊物件。
class mycontextmanager:
def __enter__(self):
print("entering the context")
執行一些初始化操作,例如開啟資源。
return self
def __exit__(self, exc_type, exc_value, traceback):
print("exiting the context")
執行一些清理操作,例如關閉資源。
if exc_type is not none:
print(f"exception: ,")
true 返回值表示異常已處理,false 返回值表示異常已傳播。
return true
使用上下文管理器。
with mycontextmanager() as manager:
print("inside the context")
執行讀取和寫入資源等操作。
如果此處發生異常,則將該異常傳遞給 exit 方法進行處理。
例如,在上面的示例中,myContextManager 是乙個簡單的上下文管理器類,它實現 Enter 和 Exit 方法來定義上下文管理器的行為。 在 with 語句塊中使用上下文管理器會執行適當的操作(進入、執行、退出上下文)以確保正確管理資源。
上面的執行結果:
entering the context
inside the context
exiting the context
許多人說 with 語句用於建立上下文管理器,但準確地說,這是不正確的。 在前面的示例中,mycontextmanager
它是一類上下文管理器,我們所說的建立上下文管理器無非是建立上下文管理器的物件。 下面這不會建立乙個上下文管理器物件嗎?
m = mycontextmanager()
所以準確地說,with語句是Python提供的用於管理上下文的語法結構,可以自動呼叫上下文管理器的enter和exit方法。 使用 with 語句,您可以確保在進入和退出塊時自動執行必要的操作。
例如,使用with
用於開啟和關閉檔案的語句的上下文管理器:
with open('example.txt', 'r') as file:
content = file.read()
print(content)
在 with 塊結束後,檔案會自動關閉,即使發生異常,檔案也會正確關閉。
open 函式返回的檔案物件是乙個上下文管理器,它本身不需要實現,通過使用 with 關鍵字,它確保了 ** 塊執行後檔案將被正確關閉。 無需手動呼叫file.close()
方法。 這樣提高了可讀性和可維護性,避免了忘記關閉檔案導致的資源洩漏問題。
當然,我們也可以自己手動實現檔案上下文管理器。
class filecontextmanager:
def __init__(self, file_name, mode):
self.file_name = file_name
self.mode = mode
def __enter__(self):
self.file = open(self.file_name, self.mode)
return self.file
def __exit__(self, exc_type, exc_value, exc_traceback):
if self.file:
self.file.close()
使用自定義檔案上下文管理器類開啟檔案。
with filecontextmanager('example.txt', 'w') as file:
file.write("程式設計師來了! ")
這是乙個相對簡單的檔案上下文管理器filecontextmanager('example.txt', 'w')
及以上open('example.txt', 'r')
功能幾乎相同。
這就是上下文管理器的簡要介紹。 總的來說,上下文管理器是 Python 提供的一種非常方便的資源管理機制,它可以幫助我們更好地管理和釋放資源,簡化邏輯,提高魯棒性,寫得更優雅,在專案開發中用起來很舒服。