Общеизвестно, что метод 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):
???
а как тогда с этим справиться? Может быть, я упустил что-то важное? Или я могу использовать диспетчер контекста только внутри функции, а не как переменную внутри области класса?