【发布时间】:2013-03-03 20:52:29
【问题描述】:
众所周知,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()
我的问题:当我使用__enter__ 和__exit__ 方法在mydevice.py 中实现上下文管理器时,如何在myclass.py 中处理此类?我需要做类似的事情
def __init__(self, device):
with mydevice.MyWrapper(device):
???
但是如何处理呢?也许我忽略了一些重要的事情?或者我可以只在函数内使用上下文管理器,而不是作为类范围内的变量吗?
【问题讨论】:
标签: python contextmanager