Итерация над экземплярами объекта данного класса в Python

Учитывая класс, который хранит реестр своих объектов:

class Person(object):
   __registry = []

   def __init__(self, name):
       self.__registry.append(self)
       self.name = name

Как мне сделать следующий код работы (без использования реестра Person.__):

for personobject in Person:
    print personobject

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

Ответы

Ответ 1

Вы можете сделать свой объект класса итерабельным с помощью простого метакласса.

class IterRegistry(type):
    def __iter__(cls):
        return iter(cls._registry)

class Person(object):
    __metaclass__ = IterRegistry
    _registry = []

    def __init__(self, name):
        self._registry.append(self)
        self.name = name

(Я также изменил __registry на _registry, чтобы упростить доступ из метакласса). Тогда,

>>> p = Person('John')
>>> p2 = Person('Mary')
>>> for personobject in Person:
...     print personobject
...
<person.Person object at 0x70410>
<person.Person object at 0x70250>

Ответ 2

Во-первых, не используйте двойные имена __. Они зарезервированы для использования Python. Если вы хотите, чтобы "private" использовал одиночный _.

Во-вторых, держите это как можно проще. Не тратьте много времени и энергии на что-то сложное. Это простая проблема, чтобы код был как можно более простым, чтобы выполнить задание.

class Person(object):
    _registry = []

    def __init__(self, name):
        self._registry.append(self)
        self.name = name

for p in Person._registry:
    print p

Ответ 3

вы можете сделать это с помощью

for item in Person.__registry:
    print(item)