代码之家  ›  专栏  ›  技术社区  ›  Titusz

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

  •  16
  • Titusz  · 技术社区  · 17 年前

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

    class Person(object):
       __registry = []
    
       def __init__(self, name):
           self.__registry.append(self)
           self.name = name
    

    我将如何使以下代码工作(不使用Person.\u注册表):

    for personobject in Person:
        print personobject
    

    在研究的时候,我发现了一个暗示,一个人可以 __metaclass__ 用一个 __getitem__ -方法。你知道这看起来怎么样吗?

    3 回复  |  直到 17 年前
        1
  •  22
  •   dF.    17 年前

    您可以使用一个简单的元类使类对象变为可访问的。

    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
  •  10
  •   S.Lott    17 年前

    第一,不要用双份的 __ 名字。它们是为python保留的。如果你想“私人”使用单人 _ .

    第二,尽量保持这种简单。不要在复杂的事情上浪费很多时间和精力。这是一个简单的问题,保持代码尽可能简单以完成任务。

    class Person(object):
        _registry = []
    
        def __init__(self, name):
            self._registry.append(self)
            self.name = name
    
    for p in Person._registry:
        print p
    
        3
  •  2
  •   SilentGhost    17 年前

    您可以通过以下方式完成:

    for item in Person.__registry:
        print(item)