常識であるため、Python__del__
メソッドは、このメソッドが呼び出されることが保証されていないため、重要なものをクリーンアップするために使用しないでください。別の方法は、いくつかのスレッドで説明されているように、コンテキストマネージャーを使用することです。
しかし、コンテキストマネージャーを使用するようにクラスを書き直す方法がよくわかりません。詳述すると、ラッパークラスがデバイスを開閉し、クラスのインスタンスがそのスコープから外れた場合(例外など)にデバイスを閉じるという単純な(機能しない)例があります。
最初のファイルmydevice.py
は、デバイスを開いたり閉じたりするための標準のラッパークラスです。
class MyWrapper(object):
def __init__(self, device):
self.device = device
def open(self):
self.device.open()
def close(self):
self.device.close()
def __del__(self):
self.close()
このクラスは別のクラスによって使用されmyclass.py
ます:
import mydevice
class MyClass(object):
def __init__(self, device):
# calls open in mydevice
self.mydevice = mydevice.MyWrapper(device)
self.mydevice.open()
def processing(self, value):
if not value:
self.mydevice.close()
else:
something_else()
私の質問:mydevice.py
withメソッド__enter__
と__exit__
メソッドでコンテキストマネージャーを実装する場合、このクラスをどのように処理できmyclass.py
ますか?私は次のようなことをする必要があります
def __init__(self, device):
with mydevice.MyWrapper(device):
???
しかし、それをどのように処理するのですか?多分私は何か重要なことを見落としていましたか?または、クラススコープ内の変数としてではなく、関数内でのみコンテキストマネージャーを使用できますか?