[英]Iterate over instances of an ITERABLE class
我已經定義了以下類
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 person in Person]調用以獲取與Person.iterate()和Person._instances相同的列表?
您可以在元類上定義__iter__
以使元類實例(即Person
)可迭代:
class metaclass(type):
def __iter__(cls):
return iter(getattr(cls, '_instances', []))
class Person(metaclass=metaclass):
# __metaclass__ = metaclass Python 2
...
為了清楚起見,我已經包含了解決方案和一些測試數據,因為“Moses Koledoye”已經指出了這一點,並且我試圖考慮“chepner”也有一個有用的評論。
class PersonMeta(type):
_counter = 0
_instances = []
def __iter__(self):
return iter(getattr(self, '_instances', []))
class Person(metaclass=PersonMeta):
def __init__(self, nam):
self.name = nam
Person._instances.append(self)
self._id = Person._counter + 1
Person._counter+=1
def __repr__(self):
return f'{self._id} : Person({self.name})'
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)]
理想情況下,我希望在Metaclass和Class之間看到更清晰的分離。 但我不知道如何將以下語句轉移到MetaPerson。 這是一個好主意嗎 ? 你能幫幫我嗎?
Person._instances.append(self)
Person._counter+=1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.