Python:with 文で使うクラスを作る

作成したオブジェクトの後処理を手軽かつ確実にするには 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

コメント