有人问了一个类似的[问题]:打印一个类的所有实例。虽然我不太关心打印它们,但我更想知道当前“活动”的实例有多少。这种实例捕获的原因更像是设置计划作业,每小时检查这些“实时”未处理的实例并丰富数据。之后,要么设置此实例中的标志,要么删除此实例。Torsten Marek 在 [问题] 中的回答:使用weakrefs打印类的所有实例需要为这种类型的每个类调用基类构造函数,是否可以自动执行此操作?或者我们可以使用其他方法获取所有实例?
您可以自己跟踪它(请参阅其他答案)或询问垃圾收集器:
import gc
class Foo(object):
pass
foo1, foo2 = Foo(), Foo()
foocount = sum(1 for o in gc.get_referrers(Foo) if o.__class__ is Foo)
Run Code Online (Sandbox Code Playgroud)
如果您有很多对象,这可能会有点慢,但通常不会太糟糕,而且它的优点是您可以轻松地将其与其他人的代码一起使用。
注意:使用o.__class__而不是type(o)所以它适用于旧式类。