作成したオブジェクトの後処理を手軽かつ確実にするには with 文が便利です。
そのクラスの作成と、使用する際のメモです。
with 文で使うクラスの作成
class prc:
param = "unknown"
def __init__(self, *args, **kwargs):
self.param = kwargs.get("param")
print(f"prc init {self.param}")
def __enter__(self):
print(f"prc enter {self.param}")
return self
def __exit__(self, exception_type, exception_value, traceback):
print(f"prc exit {self.param}")
def something(self):
print(f"prc something {self.param}")
関数でオブジェクトを生成したい
コンストラクタのパラメータを決まった値にしたいので、関数でオブジェクトを返して使うとき。
def get_prc():
return prc(param="A")
print("---1---")
with get_prc() as t:
print("---2---")
t.something()
print("---3---")
---1---
prc init A
prc enter A
---2---
prc something A
---3---
prc exit A
関数をクラスのメソッドにしたい
スタティックメソッドにしたかったので @staticmethod を付けています。
class wrapB:
@staticmethod
def get_prc():
return prc(param="B")
print("---1---")
with wrapB.get_prc() as t:
print("---2---")
t.something()
print("---3---")
---1---
prc init B
prc enter B
---2---
prc something B
---3---
prc exit B
別クラスでラップしたい
class wrapC:
instance = None
def __init__(self):
print("wrap init")
self.instance = prc(param="C")
def __enter__(self):
print("wrap enter")
self.instance.__enter__()
return self
def __exit__(self, exception_type, exception_value, traceback):
print("wrap exit")
return self.instance.__exit__(exception_type, exception_value, traceback)
def something(self):
print("wrap something")
self.instance.something()
print("---1---")
with wrapC() as t:
print("---2---")
t.something()
print("---3---")
---1---
wrap init
prc init C
wrap enter
prc enter C
---2---
wrap something
prc something C
---3---
wrap exit
prc exit C
コメント