【问题标题】:Python destructors in new and old style classes [duplicate]新旧样式类中的Python析构函数[重复]
【发布时间】:2012-12-28 17:24:11
【问题描述】:

我试图了解为什么对象销毁在新样式类中的工作方式与旧样式类不同。

class Wrapper():
    class Inner(object):
        def __del__(self):
            print 'Inner destructor'

    innerInstance = Inner()

    def __del__(self):
        print 'Wrapper destructor'

if __name__ == '__main__':
    x = Wrapper()

退出时,会输出:

Wrapper destructor
Inner destructor

但是,如果我使用 Wrapper 作为新样式类,则只调用 wrapper 析构函数,输出为:

Wrapper destructor

有人可以解释上面显示的行为吗?

【问题讨论】:

  • 将此复制到较新的帖子中,而不是相反,因为较新的帖子有 a) 对问题的稍微简单的说明和 b) 解释为什么的答案> 这会发生。

标签: python destructor


【解决方案1】:

pythondata model 明确指出:

不能保证在解释器退出时仍会为仍然存在的对象调用 __del__() 方法。

在这种情况下,当解释器退出时,Wrapper(类和实例)对象仍然存在,因此不能保证它会被最终确定。即使我们看到 Wrapper instance 已完成,也不能保证 Wrapper class 将完成(这就是持有您的 @987654326 @实例)。


附带说明,如果我使用 Jython 运行此代码,则不会为任何一个对象调用 __del__(无论我们使用的是旧式还是新式类)。令人惊讶的是,如果我显式删除对象,它甚至都不起作用(使用 Jython)(但这段代码确实适用于 CPython,无论旧式/新式如何):

class Wrapper():
    class Inner(object):
        def __del__(self):
            print 'Inner destructor'

    innerInstance = Inner()

    def __del__(self):
        print 'Wrapper destructor'

if __name__ == '__main__':
    print "foo"
    x = Wrapper()
    print "bar"
    del x
    del Wrapper

【讨论】:

  • 这是否解释了为什么旧式和新式课程不同?
  • @DavidRobinson -- 它解释了该行为完全依赖于实现,并且对于这个问题没有真正的解决方案。
猜你喜欢
  • 2012-11-28
  • 2016-04-22
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2013-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多