Итерация над экземплярами объекта данного класса в 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)