为了账号安全,请及时绑定邮箱和手机立即绑定

什么是_del_方法,如何调用它?

什么是_del_方法,如何调用它?

浮云间 2019-07-06 16:46:22
什么是_del_方法,如何调用它?我在读密码。有一门课__del__方法的定义。我发现这个方法被用来摧毁这个类的一个实例。但是,我找不到使用这种方法的地方。主要原因是我不知道这种方法是如何使用的,可能不是这样的:obj1.del()..所以,我的问题是如何调用__del__方法?谢谢你的帮助。
查看完整描述

3 回答

?
叮当猫咪

TA贡献1776条经验 获得超12个赞

__del__终结器..对象为垃圾收集在删除了对象的所有引用之后,就会发生这种情况。

在.简单案例这可能就在你说的之后del x或者,如果x是函数结束后的局部变量。特别是,除非有循环引用,否则CPython(标准Python实现)将立即垃圾收集。

然而,这是一个实施细节关于CPython的。唯一所需Python垃圾回收的属性是发生这种情况。所有引用都已被删除,因此这可能没有必要发生。就在可能根本不会发生.

更重要的是,变量可以持续很长一段时间。许多原因例如,传播的异常或模块内省可以保持变量引用计数大于0。此外,变量可以是参考周期-带有垃圾收集的CPython打开中断的次数最多,但不是全部,甚至只是周期性的。

既然你不能保证它被执行了,你应该绝不可能将您需要运行的代码放在__del__()-相反,此代码属于finally的条款try块中的上下文管理器。with声明。然而,有效用例__del__*例如,如果一个物体X参考文献Y还保存了一份Y全局引用cache (cache['X -> Y'] = Y)那么这将是礼貌的X.__del__若还要删除缓存项,请执行以下操作。

如果你知道析构函数提供(违反上述准则)所需的清理,您可能想直接呼叫,因为它作为一种方法没有什么特别之处:x.__del__()..显然,只有当您知道不介意被调用两次时,您才应该这样做。或者,作为最后的手段,您可以使用

type(x).__del__ = my_safe_cleanup_method


查看完整回答
反对 回复 2019-07-06
?
holdtom

TA贡献1805条经验 获得超10个赞

这个__del__方法时,将在垃圾收集对象时调用该方法。但请注意,它不一定会被调用。以下代码本身并不一定做到这一点:

del obj

原因是del只需将参考计数减少1。如果其他东西有对象的引用,__del__不会被打电话的。

使用时有几个注意事项__del__尽管如此。一般来说,它们通常不是很有用。在我看来,你更想用一种封闭的方法,或者带语句.

Python文档__del__方法.

还有一件事要注意:__del__方法如果过度使用,可以抑制垃圾收集。特别是具有多个对象的循环引用。__del__方法不会收集垃圾。这是因为垃圾收集器不知道应该先调用哪个。请参阅GC模块想了解更多信息。


查看完整回答
反对 回复 2019-07-06
  • 3 回答
  • 0 关注
  • 781 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信