class Package:
def __init__(self):
self.files = []
# ...
def __del__(self):
for file in self.files:
os.unlink(file)
__del__(self)
以上失败并出现 AttributeError 异常。我知道当调用 __del__()
时, Python 不保证 存在“全局变量”(这种情况下的成员数据?)。如果是这种情况并且这是异常的原因,我如何确保对象正确销毁?
原文由 wilhelmtell 发布,翻译遵循 CC BY-SA 4.0 许可协议
我建议使用 Python 的
with
语句来管理需要清理的资源。使用显式close()
语句的问题在于,您必须担心人们根本忘记调用它或忘记将其放在finally
块中以防止资源泄漏发生异常。要使用
with
语句,请使用以下方法创建一个类:在上面的示例中,您将使用
然后,当有人想使用您的课程时,他们会执行以下操作:
变量 package_obj 将是 Package 类型的实例(它是
__enter__
方法返回的值)。它的__exit__
方法会自动被调用,无论是否发生异常。您甚至可以将这种方法更进一步。在上面的例子中,人们仍然可以使用它的构造函数来实例化 Package 而无需使用
with
子句。你不希望这种情况发生。您可以通过创建一个 PackageResource 类来解决此问题,该类定义了__enter__
和__exit__
方法。然后,Package 类将在__enter__
方法中严格定义并返回。这样,调用者在不使用with
语句的情况下永远无法实例化 Package 类:您可以按如下方式使用它: