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