with 實現自己的上下文管理器

2021-09-27 12:57:17 字數 1532 閱讀 4077

上下文管理器最常用在需要管理類似檔案,網路連線和鎖這樣的資源的程式中。這些資源的關鍵點在於他們必須顯式地進行關閉或釋放才能正確工作。

要編寫乙個上下文管理器,其背後的主要原則就是我們編寫的**需要包含在由with語句定義的**塊中。要讓物件能夠相容with語句,需要實現__enter__()和__exit__()方法。

實現乙個檔案的上下文管理器

class file(object):

def __init__(self, file, mode):

self.file = file

self.mode = mode

def __enter__(self):

self.opened_file = open(self.file, self.mode)

return self.opened_file

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

self.opened_file.close()

# 實現了__enter__()和__exit__()方法後,就能通過with語句進行上下文管理

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

f.write('hello')

內部實現過程:

1、with語句先暫存了file類的__exit__方法,然後它呼叫file類的__enter__方法。

2、__enter__方法開啟檔案並返回給with語句,開啟的檔案控制代碼被傳遞給opened_file引數。

3、with語句呼叫之前暫存的__exit__方法,__exit__方法關閉了檔案。

異常處理:

1、 它把異常的type,value和traceback傳遞給__exit__方法

2、 它讓__exit__方法來處理異常

3、如果__exit__返回的是true,那麼這個異常就被忽略。

4、如果__exit__返回的是true以外的任何東西,那麼這個異常將被with語句丟擲。

通過@contextmanager實現上下文管理器

利用contextlib模組中的@contextmanager裝飾器,可以非常方便的編寫一些小巧的上下文管理器函式。

from contextlib import contextmanager

@contextmanager

def file(file, mode):

file = open(file, mode)

try:

yield file

finally:

file.close()

# 使用

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

f.write('hello world!')

在file()函式中,所有位於yield之前的**會作為上下文管理器的__enter__()方法來執行,而所有位於yield之後的**會作為__exit__()方法執行。如果有異常產生,則會在yield語句中丟擲。

**:參考:

with上下文管理器

在執行 with 語句時,首先執行 with 後面的 open 執行完 後,會將 的結果通過 as 儲存到 f 中 然後在下面實現真正要執行的操作 在操作後面,並不需要寫檔案的關閉操作,檔案會在使用完後自動關閉 實際上,在檔案操作時,並不是不需要寫檔案的關閉,而是檔案的關閉操作在 with 的上下文...

with上下文管理器

上下文管理器 任何實現了enter 和exit 法的物件都可稱之為上下 管理 器,上下 管理器物件可以使 with 關鍵字。顯然,件 file 物件也實現 了上下 管理器 方法一class file def init self,filename,mode self.filename filename...

上下文管理器

今天我們聊聊上下文管理器,當然今天所談僅為個人觀點!今天如果不是學生面試回來跟我聊到了上下文管理器,我都忘了python中還有這麼個鬼了。特別寫一篇博文我們簡單聊聊。普通的檔案操作方式,例如 情況01 1 以寫的方式開啟檔案 f open 1.txt w 2 寫入檔案內容 f.write hello...