class Package:
def __init__(self):
self.files = []
# ...
def __del__(self):
for file in self.files:
os.unlink(file)
上面的__del__(self)
由于AttributeError异常而失败。我理解Python doesn't guarantee存在“全局变量”(在此上下文中的成员数据?)当调用__del__()
时。如果是这种情况,这就是异常的原因,我如何确保对象正确地销毁?
Tags:
作为Clint's answer的附录,可以使用^{} 简化
PackageResource
:或者,虽然可能不是Pythonic,但是可以重写
Package.__new__
:只需使用
with Package(...) as package
。若要缩短时间,请将清理函数命名为} ,在这种情况下,可以通过
close
,然后使用^{with contextlib.closing(Package(...))
使用未修改的Package
类,也可以将其__new__
重写为更简单的这个构造函数是继承的,所以您可以简单地继承,例如
我建议使用Python的
with
语句来管理需要清理的资源。使用显式close()
语句的问题是,您必须担心人们忘记调用它或忘记将它放在finally
块中,以防止发生异常时发生资源泄漏。要使用
with
语句,请使用以下方法创建类:在上面的例子中,您将使用
然后,当有人想使用你的课程时,他们会做以下操作:
变量package_obj将是package类型的实例(它是
__enter__
方法返回的值)。无论是否发生异常,它的__exit__
方法都将被自动调用。你甚至可以更进一步。在上面的示例中,有人仍然可以使用其构造函数实例化包,而不使用
with
子句。你不想发生这种事。可以通过创建定义__enter__
和__exit__
方法的PackageResource类来解决此问题。然后,包类将严格定义在__enter__
方法内并返回。这样,调用方就无法在不使用with
语句的情况下实例化包类:你可以这样使用:
标准方法是使用^{} :
但您应该记住,这将一直保持所有创建的
Package
实例,直到Python终止。使用上述代码的演示保存为package.py:
相关问题 更多 >
编程相关推荐