编辑:由于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__
?我原以为它会被垃圾收集。
相反,如果我想要它被垃圾收集,我该怎么做?
答案 0 :(得分:5)
见this thread。似乎发生的是类的__mro__
属性存储对自身的引用,创建引用循环。您可以强制执行完整的gc运行,这将检测循环并删除对象:
>>> class Foo(object): pass
>>> class Bar(Foo): pass
>>> import gc
>>> del Bar
>>> gc.collect()
3
>>> Foo.__subclasses__()
[]
或者,如果您暂时输入其他命令,gc将自行运行并收集循环。
请注意,在交互式测试时必须要小心,因为交互式解释器存储对“最后一个值”变量_
中最近返回的值的引用。如果你明确地查看子类列表然后立即尝试收集,它将无法工作,因为_
变量将保存一个列表,其中包含对该类的强引用。