背景關系管理器
Python 的 with陳述句支持通過背景關系管理器所定義的運行時背景關系這一概念, 此物件的實作使用了一對專門方法,允許用戶自定義類來定義運行時背景關系,在陳述句體被執行前進入該背景關系,并在陳述句執行完畢時退出該背景關系,
背景關系管理器物件
實作了背景關系協議的物件,成為背景關系管理器物件,該協議要求物件實作__enter__方法和與之對應的__exit__方法,
_enter_()
進入運行時背景關系并回傳此物件或關聯到該運行時背景關系的其他物件, 此方法的回傳值會系結到使用此背景關系管理器的 with陳述句的 as 子句中的識別符號,
最常見的是我們對鎖和檔案的操作,他們支持我們使用背景關系協議來訪問,
# open() 將檔案轉化為檔案管理器物件,此時檔案物件將會作為__enter__ 方法的回傳 給 as 后的 `f`,
# 在 __exit__ 方法中,自動的執行了 f.close() 方法,為我們關閉了檔案,
with open('file.txt', 'r', encoding='utf-8') as f:
data = https://www.cnblogs.com/monkey-code/p/f.read()
# 在此需要對例外進行處理,必須要保證無論發生什么情況,檔案總是要被順利的釋放 也就是執行 f.close()
# 這要在__exit__中實作,
_exit_(exc_type, exc_val, exc_tb)
exc_type 錯誤型別
exc_val 錯誤值
exc_tb 回溯資訊
return 回傳一個布林值, True 表示已經完美處理,False 出了問題
當無問題發生時, 回傳 True,如果
在其他情況下三個引數均為 None,自此方法回傳一個真值將導致 with陳述句屏蔽例外并繼續執行緊隨在 with 陳述句之后的陳述句, 否則例外將在此方法結束執行后繼續傳播,
在此方法執行期間發生的例外將會取代 with 陳述句的陳述句體中發生的任何例外,傳入的例外絕對不應當被顯式地重新引發 —— 相反地,此方法應當回傳一個假值以表明方法已成功完成并且不希望屏蔽被引發的例外, 這允許背景關系管理代碼方便地檢測 __exit__()方法是否確實已失敗,
例子
class Ghost(object):
""""""
def __init__(self, host):
self.host = host
def __enter__(self):
print('Create a temporary backup file.')
return self
def __exit__(self, exc_type, exc_val, exc_tb) -> bool:
"""
exc_type: 錯誤型別
exc_val: 錯誤值
exc_tb: 回溯資訊
return: 回傳一個布林值, True 表示已經完美處理,False 出了問題
"""
print('Clean up temporary backup files.')
return True # 不應該簡單粗暴的回傳 True!!! 要依據 引數來確定是 True 或 False
# 這樣寫 將不會理會with 內的陳述句成功與否 Python 都會認為一切 OK 實際開發中這是要命的!
def get_ghost(self):
print('Storage ghost %s'. % self.host)
ghost = Ghost('Master')
with ghost as f:
f.get_ghost()
# Create a temporary backup file.
# Storage ghost Master.
# Clean up temporary backup files.
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/122692.html
標籤:Python
上一篇:05.DRF-Django REST framework 簡介
下一篇:Python 記憶體管理和回收
