Я вижу две опции в этом случае:
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
В этом случае, все ссылки хранятся как слабая ссылка в списке. Если Вы создаете и удаляете много экземпляров часто, необходимо очистить список weakrefs после повторения, иначе там будет большим количеством хлама.
Другая проблема в этом случае состоит в том, что необходимо удостовериться, что вызвали конструктора базового класса. Вы могли также переопределить __new__
, но только __new__
метод класса первой базы используется на инстанцировании. Это также работает только над типами, которые находятся под Вашим контролем.
Редактирование : метод для печати всех экземпляров согласно определенному формату оставляют как осуществление, но это - в основном просто изменение на for
- циклы.
То же как почти все другие языки OO, сохраните все экземпляры класса в наборе некоторого вида.
можно попробовать такого рода вещь.
class MyClassFactory( object ):
theWholeList= []
def __call__( self, *args, **kw ):
x= MyClass( *args, **kw )
self.theWholeList.append( x )
return x
Теперь можно сделать это.
object= MyClassFactory( args, ... )
print MyClassFactory.theWholeList
Python не имеет эквивалента #allInstances Smallktalk, поскольку архитектура не имеет этого типа таблицы центрального объекта (хотя современный smalltalks, действительно не работают как этот ни один).
, Поскольку в другом плакате говорится, необходимо явно управлять набором. Его предложение метода фабрики, который поддерживает реестр, является совершенно разумным способом сделать это. Можно хотеть сделать что-то с слабые ссылки , таким образом, Вы не должны явно отслеживать объектное распоряжение.
Не ясно, необходимо ли распечатать все экземпляры класса сразу или когда они инициализируются, ни если Вы говорите о классе, Вы управляете по сравнению с классом в сторонней библиотеке.
В любом случае, я решил бы это путем записи фабрики классов с помощью поддержки метакласса Python. Если Вы не управляете классом, вручную обновляете __metaclass__
для класса или модуля, Вы отслеживаете.
См. http://www.onlamp.com/pub/a/python/2003/04/17/metaclasses.html для получения дополнительной информации.