3 回答
TA贡献1824条经验 获得超8个赞
您不能假设__del__会被调用-这不是一个希望自动分配资源的地方。如果要确保释放(非内存)资源,则应制作一个release()或类似的方法,然后显式调用它(或在Thanatos在下面的注释中指出的上下文管理器中使用它)。
至少您应该非常仔细地阅读__del__ 文档,然后您可能不应该尝试使用__del__。(另请参阅gc.garbage 文档,了解有关的其他不良信息__del__)
TA贡献1752条经验 获得超4个赞
del 不打电话 __del__
del以您使用的方式删除局部变量。__del__销毁对象时调用。Python作为一种语言无法保证何时销毁对象。
CPython是Python最常见的实现,它使用引用计数。因此,del通常会按您期望的那样工作。但是,如果您有参考循环,则该功能将无效。
d3 -> d3.func -> d3
Python不会检测到该错误,因此不会立即对其进行清理。而且它不只是参考周期。如果引发异常,则可能仍要调用析构函数。但是,Python通常会保留局部变量作为其回溯的一部分。
解决方案不取决于__del__方法。而是使用上下文管理器。
class Dummy:
def __enter__(self):
return self
def __exit__(self, type, value, traceback):
print "Destroying", self
with Dummy() as dummy:
# Do whatever you want with dummy in here
# __exit__ will be called before you get here
这样可以保证正常工作,您甚至可以检查参数以查看是否正在处理异常并在这种情况下执行其他操作。
添加回答
举报