Python自前のクラスをWithに対応させる

自前のクラス、使い終わったらclose()して欲しい。
将来の自分は、ちゃんとclose()を呼び出してくれるだろうか?
例外が発生した場合も、ちゃんとclose()を呼び出してくれるだろうか?

自前のクラスもwithでクローズ出来たら構文がスッキリする。
Javaならjava.lang.AutoCloseableインターフェースを継承してclose()メソッドを実装すれば、try-with-resource構文が使えるようになりスッキリする。
では、Pythonではどうするのだろうか。

__enter__、__exit__メソッド

自前のクラスに__enter__と__exit__を実装すればよいようだ。

__enter__は__init__の後に呼ばれる。
__enter__は戻り値としてselfを返却すればよい。

__exit__はwithが終わったところで呼び出される。
引き数は必ず4つ受け取る必要がある。withから渡される。
with内で例外が発生したとき、その情報が入っているらしい。

class MyClass:
    def __init__(self, init_value):
        self.xxx = Xxx(init_value)

    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.xxx.close()

    def proc(self, proc_value):
        self.xxx.yyy(proc_value)

with MyClass('ABC') as m:
    m.proc('LMN')

このような実装で、withから抜けた時にMyClassがちゃんと閉じられる。

まとめ

FTP接続し複数ファイルを転送したらcloseするとか、
DB接続し処理が完了したらcloseとかいろいろ使えそうだ。
キレイにまとまってよかった。

同じタグの記事
同じカテゴリの記事

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA