這篇文章主要介紹了python 上下文管理器原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
Python 提供了 with 語法用于簡化資源操作的后續清除操作,是 try/finally 的替代方法,實現原理建立在上下文管理器之上。
Python 提供了一個 contextmanager 裝飾器,更進一步簡化上下管理器的實現方式。
上下文管理器是Python2.5之后才出現的概念。上下文管理器規定了某個對象的使用范圍,當進入或者離開了使用范圍,都會有相應的一些調用,比如代碼塊開始時執行一些準備,代碼塊結束時結束一些操作。它更多的是用于資源的分配和釋放上,即在開始時分配資源,結束時釋放一些資源。比如在執行數據庫查詢時要建立連接,查詢結束后要釋放連接;寫文件時要先打開文件,寫結束后,要關閉文件等等。還有,就是資源的加鎖和解鎖,比如在使用多線程時,可能會用到加鎖和解鎖。
上下文管理器可以通過使用更可讀、更精簡的代碼實現資源的分配與釋放。
復制代碼
with的使用
對于上下文管理器的使用,最常見的是使用with語句,with語句可構建資源的分配與釋放的語法糖。
因為with語句就是為支持上下文管理器而存在的,使用上下文管理協議的方法包裹一個代碼塊(with語句體)的執行,并為try...except...finally提供了一個方便使用的封裝。
一般語法:
def load_data(filename): f = file(filename,'w') try: f.write('test file') finally: f.close()
使用with:
# 使用withwith open('test.txt', 'w') as f: f.write('Python')
通過 with 語句在編寫代碼時,會使代碼變得更加簡潔,不用再去關閉文件。
我們并不需要寫文件的關閉操作,文件會在使用完后自動關閉。
with的執行原理
實際上,在文件操作時,并不是不需要寫文件的關閉,而是文件的關閉操作在 with 的上下文管理器中的協議方法里已經寫好了。當文件操作執行完成后, with語句會自動調用上下文管理器里的關閉語句來關閉文件資源。
上下文管理協議(context management protocol)
ContextManager ,上下文是 context 直譯的叫法,在程序中用來表示代碼執行過程中所處的前后環境。
上下文管理器中有 __enter__ 和 __exit__ 兩個方法,以with為例子,__enter__ 方法會在執行 with 后面的語句時執行,一般用來處理操作前的內容。比如一些創建對象,初始化等;__exit__ 方法會在 with 內的代碼執行完畢后執行,一般用來處理一些善后收尾工作,比如文件的關閉,數據庫的關閉等。
上下文管理協議包括兩個方法:
新聞熱點
疑難解答