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