1.with 語句的執行過程:
在執行 with 語句時,首先執行 with 後面的 open 代碼 執行完代碼後,會将代碼的結果通過 as 儲存到 f 中 然後在下面實作真正要執行的操作 在操作後面,并不需要寫檔案的關閉操作,檔案會在使用完後自動關閉
2. with 語句的執行原理
實際上,在檔案操作時,并不是不需要寫檔案的關閉,而是檔案的關閉操作在 with 的上下文管理器中的協定方法裡已經寫好了。 當檔案操作執行完成後, with語句會自動調用上下文管理器裡的關閉語句來關閉檔案資源。
3.上下文管理器
with 語句在執行時,需要調用上下文管理器中的 __enter__ 和 __exit__ 兩個方法。 __enter__ 方法會在執行 with 後面的語句時執行,一般用來處理操作前的内容。比如一些建立對象,初始化等。 __exit__ 方法會在 with 内的代碼執行完畢後執行,一般用來處理一些善後收尾工作,比如檔案的關閉,資料庫的關閉等。
4.自定義上下文管理器,代碼如下(注釋很重要!!!)
class MyCount(object):
def __init__(self, x, y):
self.__x = x
self.__y = y
def __enter__(self):
"""with退出時自動執行的語句"""
print("with退出時執行的語句")
# 需要注意的是:
# 1.MyCount()建立對象并命名為mc====>with MyCount(6, 0) as mc:相當于mc = MyCount(6, 0)
# 2.在使用div方法之前會先調用__enter__方法,self代表的就是mc
# 3.是以直接傳回self即可,也可以不傳回,沒有影響
return self
def __exit__(self, exc_type, exc_val, exc_tb):
# 通過 參數接收到的值,來判斷程式執行是否出現異常
# 如果是 None ,說明沒有異常
print("with結束時自動執行的語句")
if exc_type == None:
print('計算正确執行')
else:
# 否則出現異常,可以選擇怎麼處理異常
print(exc_type)
print(exc_val)
print(exc_tb)
# 傳回值決定了捕獲的異常是否繼續向外抛出
# 如果是 False 那麼就會繼續向外抛出,程式會看到系統提示的異常資訊
# 如果是 True 不會向外抛出,程式看不到系統提示資訊,隻能看到else中的輸出
return True
def div(self):
print(self.__x / self.__y)
with MyCount(6, 0) as mc:
mc.div()
執行結果:
5.總結
- with 語句主要是為了簡化代碼操作。
- with 在執行過程中,會自動調用上下文管理器中的 __enter__ 和 __exit__ 方法
- __enter__ 方法主要用來做一些準備操作
- __exit__ 方法主要用來做一些善後工作
如果你和我有共同愛好,我們可以加個好友一起交流!