在Python中迭代给定类的对象实例

时间:2009-04-11 11:13:10

标签: python oop

给定一个保留其对象注册表的类:

class Person(object):
   __registry = []

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

如何使以下代码工作(不使用Person .__注册表):

for personobject in Person:
    print personobject

在进行研究时,我发现可以使用__metaclass__方法获得__getitem__的提示。有什么想法会是这样吗?

3 个答案:

答案 0 :(得分:22)

您可以使用简单的元类使您的类对象可迭代。

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>

答案 1 :(得分:11)

首先,不要使用双__个名称。它们保留供Python使用。如果您想要“私人”,请使用单_

其次,尽可能简化这类事情。不要在复杂的事情上浪费大量的时间和精力。这是一个简单的问题,让代码尽可能简单,以完成工作。

class Person(object):
    _registry = []

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

for p in Person._registry:
    print p

答案 2 :(得分:2)

你可以用:

for item in Person.__registry:
    print(item)