06 #### `__enter__、__exit__` 用來對上下文管理,可以使用這兩個方法

jhchena發表於2024-09-27
# __enter__、__exit__ 用來對上下文管理
class content:

    def __init__(self, filepath, mode):
        self.filepath = filepath
        self.mode = mode
        self.encoding = 'utf-8'
        self.fileobject = None

    def __enter__(self):
        # 可以用來:開啟檔案、連結、資料操作
        self.fileobject = open(self.filepath, self.mode, encoding=self.encoding)  # 得到一個檔案物件,然後進行返回
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        # 關閉 or 結束
        self.fileobject.close()  # 操作完成後,進行關閉檔案

    def send(self):
        self.fileobject.write('傳送\n')  # 透過獲取的檔案物件進行寫操作

    def read(self):
        self.fileobject.write('傳送222\n')


# 寫法1
obj = content('test', 22)

# 如果需要支援 with,需要在類方法中,增加__enter、__exit__方法,否則報錯

with obj as xxx:  # with的是一個物件,只要with這個物件時,自動執行__enter 方法,

    print(xxx)  # 如果enter中return 123,此時as xxx 中的:xxx  就等於123

# 寫法2
# 也支援下面的這種寫法:
with content('test.txt', 'a') as obj:
    print(obj)  # 當with裡面的程式碼執行完後,自動執行 __exit__ 方法
    # 此時執行的 obj.send/obj.read 都 在 __enter__ 之後
    obj.send()
    obj.read()

相關文章