4

编辑:由于 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__函数获得?我原以为它会被垃圾收集。

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

4

1 回答 1

7

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

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

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

请注意,在交互式测试时必须小心,因为交互式解释器会将对最近返回值的引用存储在 "last value" 变量_中。如果你显式查看子类列表,然后立即尝试收集,它不会起作用,因为该_变量将保存一个对类有强引用的列表。

于 2013-01-20T08:49:48.103 回答