删除类时__subclasses__的行为

时间:2013-01-20 08:23:55

标签: python garbage-collection

编辑:由于NPE的评论而推广了问题。

在Python 2.7.3交互式会话中:

>>> class Foo(object):
...     pass
... 
>>> type("Bar", (Foo,), {})
<class '__main__.Bar'>
>>> Foo.__subclasses__()
[<class '__main__.Bar'>]
>>> 

此外:

>>> class Foo(object):
...     pass
... 
>>> class Bar(Foo):
...     pass
... 
>>> Foo.__subclasses__()
[<class '__main__.Bar'>]
>>> del Bar
>>> Foo.__subclasses__()
[<class '__main__.Bar'>]

Bar功能如何仍然可以使用__subclasses__?我原以为它会被垃圾收集。

相反,如果我想要它被垃圾收集,我该怎么做?

1 个答案:

答案 0 :(得分:5)

this thread。似乎发生的是类的__mro__属性存储对自身的引用,创建引用循环。您可以强制执行完整的gc运行,这将检测循环并删除对象:

>>> class Foo(object): pass
>>> class Bar(Foo): pass
>>> import gc
>>> del Bar
>>> gc.collect()
3
>>> Foo.__subclasses__()
[]

或者,如果您暂时输入其他命令,gc将自行运行并收集循环。

请注意,在交互式测试时必须要小心,因为交互式解释器存储对“最后一个值”变量_中最近返回的值的引用。如果你明确地查看子类列表然后立即尝试收集,它将无法工作,因为_变量将保存一个列表,其中包含对该类的强引用。