5

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

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

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

4

1 回答 1

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
于 2013-01-14T17:52:59.623 回答