众所周知,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):
???
那么该如何处理呢?也许我忽略了什么重要的东西吗?或者我只能在函数内部使用上下文管理器,而不能在类范围内作为变量使用吗?
def open_device
函数中需要返回吗? - Mr_and_Mrs_D