簡體   English   中英

迭代ITERABLE類的實例

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM