python - 如何在删除扩展对象后更新__subclasses__列表

时间:2018-01-23 17:47:45

标签: python inheritance subclass

我应该首先说这可能不是最好的做法,所以我可以提出建议。 我在一个对象的__subclasses__列表上转发以运行多个操作。问题是我希望动态添加和删除对象,我希望__subclasses__列表能够反映这些更改。但是我没有成功更新它。 这是一个例子:

>>> class a(object):
>>>     pass
>>> class b(a):
>>>     pass
>>> del b
>>> a.__subclasses__()
[<class 'b'>]

我期待得到一个空列表。 现在,因为我在我的代码中使用a。__subclasses__(),我想在删除对象时更新它。

我尝试使用垃圾收集器并在删除建议here之后的对象后立即调用collect(),但这也没有帮助。

如果您认为这不是最佳做法,并且有更好的方法可以解决这个问题,我会很高兴听到:)

1 个答案:

答案 0 :(得分:0)

Python使用弱引用来填充__subclasses__()。只需运行gc.collect()即可清除它。

如果您仍然看到其中引用了b,那只是意味着还有更多对该对象的引用。这可能就像_最后结果引用一样简单:

>>> import sys
>>> sys.version_info
sys.version_info(major=2, minor=7, micro=14, releaselevel='final', serial=0)
>>> class a(object): pass
...
>>> class b(a): pass
...
>>> del b
>>> a.__subclasses__()  # result will be referenced by _
[<class '__main__.b'>]
>>> import gc
>>> gc.collect()
0
>>> a.__subclasses__()  # result will be referenced by _
[<class '__main__.b'>]
>>> 'Clear the _ reference by running a different expression'
'Clear the _ reference by running a different expression'
>>> gc.collect()
3
>>> a.__subclasses__()
[]

因此,一旦我们将_指向另一个对象,就不会留下对b的引用,也会清除子类弱引用。