自前のクラス、使い終わったら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とかいろいろ使えそうだ。
キレイにまとまってよかった。
同じタグの記事
- BOM付きUTF-8からBOMを除去するpython
- jythonのヒープメモリ設定
- Kotlin1.2.50がリリースされていた
- macOSをHigh Sierraに更新した。スクリプト実行環境のバージョンは変わったのか
- macOSをMojaveに更新した。スクリプト実行環境のバージョンは変わったか
- pathlib.Pathを調べる
- pyenvでpython環境をインストール
- pyenvとvirtualenvでpython環境を構築
- python unpack
- python3で数値のlistを文字列のlistに変換
同じカテゴリの記事
コメントを残す