Iterating over object instances of a given class in Python

前端 未结 3 1385
轻奢々
轻奢々 2020-12-13 02:46

Given a class that keeps a registry of its Objects:

class Person(object):
   __registry = []

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


        
相关标签:
3条回答
  • 2020-12-13 03:22

    You can make your class object iterable with a simple metaclass.

    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
    

    (I have also changed __registry to _registry to make it easier to access from the metaclass). Then,

    >>> p = Person('John')
    >>> p2 = Person('Mary')
    >>> for personobject in Person:
    ...     print personobject
    ...
    <person.Person object at 0x70410>
    <person.Person object at 0x70250>
    
    0 讨论(0)
  • 2020-12-13 03:28

    you can do it with:

    for item in Person.__registry:
        print(item)
    
    0 讨论(0)
  • 2020-12-13 03:32

    First, do not use double __ names. They're reserved for use by Python. If you want "private" use single _.

    Second, keep this kind of thing as simple as possible. Don't waste a lot of time and energy on something complex. This is a simple problem, keep the code as simple as possible to get the job done.

    class Person(object):
        _registry = []
    
        def __init__(self, name):
            self._registry.append(self)
            self.name = name
    
    for p in Person._registry:
        print p
    
    0 讨论(0)
提交回复
热议问题