【问题标题】:In python 2.x should I call object.__del__?在 python 2.x 中我应该调用 object.__del__ 吗?
【发布时间】:2011-05-11 02:57:18
【问题描述】:

在 Python 3.x 中,所有类都是 object 的子类。在 2.x 中,您必须明确声明 class MyClass(object)。而且,当我尝试编写尽可能多的 3.x 兼容代码时,我将继承 object

在我的程序中,我使用了__del__ 方法,我想知道我是否应该调用object.__del__(self),或者这是否得到了神奇的处理?

谢谢, 韦恩

编辑: 我的意思似乎有些混乱 - 在它声明的文件中:

如果基类具有__del__() 方法,则派生类的__del__() 方法(如果有)必须显式调用它以确保正确删除实例的基类部分。

所以我想知道我是否需要:

def __del__(self):
    object.__del__(self)

或一些合适的替代品。

【问题讨论】:

  • 你到底为什么打电话给__del__?这有什么可能的目的?为什么不使用del 语句并避免这种情况呢?你在做一些super( class, self ).__del__()吗?为什么?
  • @S.Lott,__del__ 的文档提到调用超类的__del__,我找不到任何有关将__del__ 与子类化object 结合使用的信息。我没想到只是反省object 发现它没有__del__,但现在我知道了。

标签: python subclass destructor python-2.x


【解决方案1】:

__del__ 不应该被调用。当对象没有更多引用并被收集时,析构函数会自动执行。

相反,您不会调用__init__,而是在创建对象时自动处理。调用 __del__ 不会破坏对象,这样做实际上可能会导致意外行为。

【讨论】:

    【解决方案2】:

    检查http://docs.python.org/reference/datamodel.html#basic-customizationhttp://docs.python.org/library/gc.html#module-gc。你不需要在你的对象上调用__del__ 方法,因为垃圾收集器应该为你做这件事。只需编写一个正确的__del__ 方法,python 就会为您处理。

    【讨论】:

    • 看来我没有清楚地沟通 - 我没有调用 my 对象的__del__ - 我(希望)我在编辑中澄清了我的问题。
    【解决方案3】:

    嗯,object 实际上没有 __del__ 方法,所以不,你不需要调用它。

    >>> object().__del__
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'object' object has no attribute '__del__'
    

    【讨论】:

      猜你喜欢
      • 2012-02-13
      • 2017-04-08
      • 2020-03-17
      • 2012-04-13
      • 1970-01-01
      • 2010-09-17
      • 2016-11-29
      • 2011-10-22
      • 2017-05-12
      相关资源
      最近更新 更多