Печать всех экземпляров класса

56
задан Chris 26 September 2012 в 07:28
поделиться

4 ответа

Я вижу две опции в этом случае:

Сборщик "мусора"

import gc
for obj in gc.get_objects():
    if isinstance(obj, some_class):
        dome_something(obj)

Это имеет недостаток того, чтобы быть очень медленным, когда у Вас есть много объектов, но работы с заменяют вводом с клавиатуры, который Вы не имеете никакого контроля.

Использование смешивание и weakrefs

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 - циклы.

87
ответ дан Torsten Marek 26 November 2019 в 17:14
поделиться

То же как почти все другие языки 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
3
ответ дан Mike Samuel 26 November 2019 в 17:14
поделиться

Python не имеет эквивалента #allInstances Smallktalk, поскольку архитектура не имеет этого типа таблицы центрального объекта (хотя современный smalltalks, действительно не работают как этот ни один).

, Поскольку в другом плакате говорится, необходимо явно управлять набором. Его предложение метода фабрики, который поддерживает реестр, является совершенно разумным способом сделать это. Можно хотеть сделать что-то с слабые ссылки , таким образом, Вы не должны явно отслеживать объектное распоряжение.

3
ответ дан Mike Samuel 26 November 2019 в 17:14
поделиться

Не ясно, необходимо ли распечатать все экземпляры класса сразу или когда они инициализируются, ни если Вы говорите о классе, Вы управляете по сравнению с классом в сторонней библиотеке.

В любом случае, я решил бы это путем записи фабрики классов с помощью поддержки метакласса Python. Если Вы не управляете классом, вручную обновляете __metaclass__ для класса или модуля, Вы отслеживаете.

См. http://www.onlamp.com/pub/a/python/2003/04/17/metaclasses.html для получения дополнительной информации.

1
ответ дан Daniel Naab 26 November 2019 в 17:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: