我应该首先说这可能不是最好的做法,所以我可以提出建议。
我在一个对象的__subclasses__
列表上转发以运行多个操作。问题是我希望动态添加和删除对象,我希望__subclasses__
列表能够反映这些更改。但是我没有成功更新它。
这是一个例子:
>>> class a(object):
>>> pass
>>> class b(a):
>>> pass
>>> del b
>>> a.__subclasses__()
[<class 'b'>]
我期待得到一个空列表。
现在,因为我在我的代码中使用a。__subclasses__()
,我想在删除对象时更新它。
我尝试使用垃圾收集器并在删除建议here之后的对象后立即调用collect()
,但这也没有帮助。
如果您认为这不是最佳做法,并且有更好的方法可以解决这个问题,我会很高兴听到:)
答案 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
的引用,也会清除子类弱引用。