Python 迭代ITERABLE类的实例

Python 迭代ITERABLE类的实例,python,Python,我定义了以下类 class Person(object): _counter = 0 _instances = [] def __init__(self, nam): self.name = nam self._instances.append(self) self._id = Person._counter + 1 Person._counter+=1 def _

我定义了以下类

class Person(object):        
    _counter = 0
    _instances = []

    def __init__(self, nam):
        self.name = nam
        self._instances.append(self)
        self._id = Person._counter + 1
        Person._counter+=1        

    def __repr__(self):
        return f'{self._id} : Person({self.name})'    

    def __iter__(self):
        return self

    def __next__(self):
        pass

    @classmethod
    def iterate(cls):
        return [p for p in Person._instances]
我可以使用

[p for p in Person._instances]
我想了解如何通过打电话达到同样的结果

[p for p in Person]
我搜索了许多类似的问题,并尝试了几个建议的答案,但没有任何运气。我使用的是Python 3.6 Anaconda x64,在我在解释器上测试的所有解决方案中,我都得到了回报

  [p for p in Person]
  TypeError: 'type' object is not iterable

你能准确地写下我如何成功地执行这个[p for p in Person]调用,以获得与Person.iterate()和Person.u实例相同的列表吗?

你可以在元类上定义一个
\uu iter\uu
,使元类实例(即
Person
)可执行:

class metaclass(type):
   def __iter__(cls):
       return iter(getattr(cls, '_instances', []))

class Person(metaclass=metaclass):  
    # __metaclass__ = metaclass Python 2
    ...

为了清楚起见,我已经包括了解决方案和一些测试数据,正如“Moses Koledoye”已经指出的那样,还有“chepner”的一条有用的评论,我试图将其考虑在内

解决方案
输出 理想情况下,我希望看到元类和类之间有一个更清晰的分离。但我不知道如何将下面的语句传递给元人称。这是个好主意吗?你能帮我吗

Person._instances.append(self)    
Person._counter+=1 

为了做到这一点,您需要让
Person
拥有一个元类,其实例是可编辑的。@不,问题不同。@glglgl感谢您指出这一点,收回我的简历。我曾尝试在我的Person类中包含iter和next方法,但我失败了,出现了相同的异常TypeError:“type”对象不是iterable我也尝试了许多不同的方法来包含元类,但我失败了,出现了相同的TypeError!!!我会让元类添加属性并保持更新。@chepner视情况而定。我更喜欢在元类中只保留非平凡的代码,因此它具有高度的可重用性和轻量级;“如果我理解你的话。”莫斯科莱多耶感谢你的回答,正如我说的,我已经尝试过类似的答案,包括你的答案,但没有任何运气。我是Python3.6的用户,您编写的元类是用于Python2的。那么Python 3.6中的解决方案是什么呢?@Athanasios解决方案如更新的答案所示:
classperson(metaclass=metaclass)
他输入的代码是python3。。。注释是如何在Python2中执行相同的操作
In [70]: [p for p in Person]
Out[70]: 
[1 : Person(James),
 2 : Person(George),
 3 : Person(Jack),
 4 : Person(Mary),
 5 : Person(Sue),
 6 : Person(James),
 7 : Person(George),
 8 : Person(Jack),
 9 : Person(Mary),
 10 : Person(Sue)]
Person._instances.append(self)    
Person._counter+=1