新旧样式类中的Python析构函数

时间:2013-01-14 17:45:58

标签: python destructor

我试图理解为什么对象破坏在新风格类中的作用与旧风格类不同。

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 destructor

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

1 个答案:

答案 0 :(得分:4)

python data model明确指出:

  

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

在这种情况下,当解释器退出时,Wrapper(类和实例)对象仍然存在,因此无法保证它将被最终确定。即使我们看到Wrapper 实例已定稿,也没有任何保证,Wrapper 将最终确定(这是什么持有你的Inner实例。


作为旁注,如果我使用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