删除类时__subclasses__的行为

jl6*_*jl6 4 python garbage-collection

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

在Python 2.7.3交互式会话中:

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

也:

>>> class Foo(object):
...     pass
... 
>>> class Bar(Foo):
...     pass
... 
>>> Foo.__subclasses__()
[<class '__main__.Bar'>]
>>> del Bar
>>> Foo.__subclasses__()
[<class '__main__.Bar'>]
Run Code Online (Sandbox Code Playgroud)

为什么Bar还能通过该__subclasses__功能获得?我本来以为它是垃圾收集的.

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

Bre*_*arn 6

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

>>> class Foo(object): pass
>>> class Bar(Foo): pass
>>> import gc
>>> del Bar
>>> gc.collect()
3
>>> Foo.__subclasses__()
[]
Run Code Online (Sandbox Code Playgroud)

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

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