众所周知,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):
???
但是如何处理呢?也许我忽略了一些重要的事情?或者我可以只在函数中使用上下文管理器,而不是作为类范围内的变量吗?