如果您是创建类的人,则可以在实例化类时简单地存储弱引用:import weakref
class A(object):
instances = []
def __init__(self):
A.instances.append(weakref.ref(self))
a, b, c = A(), A(), A()
instances = [ref() for ref in A.instances if ref() is not None]
使用弱引用允许在类之前释放实例。在
请参阅^{}模块以了解有关其功能的详细信息。在
请注意,即使在没有编写的类中,您也可以使用这种技术。你只需要把猴子补丁放到课堂上。
例如:
^{pr2}$
然后您可以:track_instances(ExternalClass)
在执行该语句之后创建的所有实例都将在ExternalClass.instances中找到。在
根据类的不同,您可能需要替换__new__,而不是{}。在
即使在类中没有任何特殊代码,也可以这样做,只需使用垃圾收集器:import gc
candidates = gc.get_referrers(cls_object)
instances = [candidate for candidate in candidates if isinstance(candidate, cls_object)]
因为可以使用object.__subclasses__方法找到类对象,所以始终可以获得该类对象:cls_object = next(cls for cls in object.__subclasses__() if cls.__name__ == cls_name)
(假设只有一个类具有该名称,否则您应该尝试所有这些类)
然而,我想不出这样做是正确的,所以在实际应用程序中避免使用此代码。在
我做了一些测试,我相信这个解决方案可能不适用于内置类或C扩展中定义的类。在
如果您在这种情况下,最后的方法是使用gc.get_objects()来检索所有跟踪的对象。但是,只有当对象支持循环垃圾收集时,这才有效,因此没有一个方法可以在每个可能的情况下工作。在