参见英文答案 > Why do new style class and old style class have different behavior in this case? 1个
我试图理解为什么对象破坏在新风格类中与旧风格类相比有不同的作用.
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
有人可以解释上面显示的行为吗?
最佳答案
python data model明确指出:
It is not guaranteed that
__del__()
methods are called for objects that still exist when the interpreter exits.
在这种情况下,解释器退出时仍然存在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