Если вы один создания класса вы можете просто хранить слабые ссылки при создании экземпляра класса:
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]
Использование слабых ссылок позволяет экземпляры должны быть высвобождены перед классом.
Подробные сведения о том, что он делает, см. В модуле weakref
.
Обратите внимание, что вы может быть в состоянии использовать эту технику, даже с классами, которые вы не писали. Вам просто нужно monkey-patch класс. Например:
def track_instances(cls):
def init(self, *args, **kwargs):
getattr(self, 'instances').append(weakref.ref(self))
getattr(self, '_old_init')(self, *args, **kwargs)
cls._old_init = cls.__init__
cls.__init__ = init
return cls
Тогда вы можете сделать:
track_instances(ExternalClass)
И все экземпляры, созданные после исполнения этого утверждения можно найти в ExternalClass.instances
.
В зависимости от класса вам, возможно, придется заменить __new__
вместо __init__
.
Вы можете сделать это даже без любого специального кода в классе, просто используя сборщик мусора:
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()
для получения всех отслеживаемых объектов. Однако это будет работать только в том случае, если объект поддерживает циклическую сборку мусора, поэтому нет способа, который работает в каждые возможной ситуации.
0 Вы еще не добавили код ко всему, что вы пытаетесь это сделать? Я не понимаю, что вы имеете в виду с именем объекта в этом контексте. – RickyA
Вы хотите получить все * экземпляры * данного класса? – Bakuriu
Я думаю, вы можете найти ответ [здесь] (http://stackoverflow.com/questions/6566767/how-to-obtain-all-instances-of-a-class-within- the-current-module). – OBu