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

Ale*_*ope 5 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()
Run Code Online (Sandbox Code Playgroud)

在退出时,这将输出:

Wrapper destructor
Inner destructor
Run Code Online (Sandbox Code Playgroud)

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

Wrapper destructor
Run Code Online (Sandbox Code Playgroud)

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

mgi*_*son 4

python数据模型明确指出:

不保证为__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
Run Code Online (Sandbox Code Playgroud)

  • @DavidRobinson——它解释了该行为**完全依赖于实现**并且这个问题没有真正的解决方案。 (6认同)