Как известно, метод 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
с помощью методов __enter__
и __exit__
, как этот класс может обрабатываться в myclass.py
? Мне нужно сделать что-то вроде
def __init__(self, device):
with mydevice.MyWrapper(device):
???
но как с этим справиться? Может, я забыл что-то важное? Или я могу использовать диспетчер контекста только внутри функции, а не как переменную внутри области класса?