Я вижу два варианта в этом случае:
Сборщик мусора
import gc
for obj in gc.get_objects():
if isinstance(obj, some_class):
dome_something(obj)
Недостатком является то, что он очень медленный, когда у вас много объектов, но работает с типами, над которыми у вас нет контроля.
Используйте миксин и слабые звуки
from collections import defaultdict
import weakref
class KeepRefs(object):
__refs__ = defaultdict(list)
def __init__(self):
self.__refs__[self.__class__].append(weakref.ref(self))
@classmethod
def get_instances(cls):
for inst_ref in cls.__refs__[cls]:
inst = inst_ref()
if inst is not None:
yield inst
class X(KeepRefs):
def __init__(self, name):
super(X, self).__init__()
self.name = name
x = X("x")
y = X("y")
for r in X.get_instances():
print r.name
del y
for r in X.get_instances():
print r.name
В этом случае все ссылки сохраняются как слабые ссылки в списке. Если вы часто создаете и удаляете много экземпляров, вы должны очистить список слабых ссылок после итерации, в противном случае будет много бесполезных действий.
Другая проблема в этом случае заключается в том, что вы должны обязательно вызвать конструктор базового класса. Вы также можете переопределить __new__
, но только метод __new__
первого базового класса используется при создании экземпляра. Это также работает только для типов, находящихся под вашим контролем.
Редактировать : метод печати всех экземпляров в соответствии с определенным форматом оставлен в качестве упражнения, но в основном это всего лишь разновидность for
-loops.