天天看點

with上下文管理器

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()
           

 執行結果:

with上下文管理器

5.總結

  1. with 語句主要是為了簡化代碼操作。
  2. with 在執行過程中,會自動調用上下文管理器中的 __enter__ 和 __exit__ 方法
  3. __enter__ 方法主要用來做一些準備操作
  4. __exit__ 方法主要用來做一些善後工作

如果你和我有共同愛好,我們可以加個好友一起交流!

with上下文管理器

繼續閱讀