迭代由其他类组成的类

时间:2017-11-21 08:29:21

标签: python oop

我有一个以下列方式表示某些数据的结构:

/cms

我想迭代class GenericDataHolder(object): def __init__(self): self.xxx=[] self.yyy=[] class A(object): def __init__(self): self.a1=GenericDataHolder() self.a2=GenericDataHolder() class B(object): def __init__(self): self.b1=GenericDataHolder() self.b2=GenericDataHolder() self.b3=A() 元素,以便我能够访问所有嵌套对象,如下所示:

class B

我读过有一些可能的解决方案可以解决这个问题:

  • 使用元类
  • 实施迭代器协议
  • 使用itertools

这对基本的例子来说都很好,但我找不到任何直接面对的问题的解决方案 - 让类的元素由其他类组成。

1 个答案:

答案 0 :(得分:3)

for使用对象的(内部等价物)iter() function来获取迭代器。实施__iter__ method以生成一个:

class B(object):
    def __init__(self):
        self.b1 = GenericDataHolder()
        self.b2 = GenericDataHolder()
        self.b3 = A()

    def __iter__(self):
        yield self.b1
        yield self.b2
        yield from iter(self.b3)  # use `for sub in self.b3: yield sub` in Python 2

我使用生成器函数来生成迭代器;调用__iter__时,会创建一个生成器对象,然后按顺序生成b1b2

(Python 3)yield from语法然后委托b3中的所有这些值,这也需要实现协议:

class A(object):
    def __init__(self):
        self.a1 = GenericDataHolder()
        self.a2 = GenericDataHolder()

    def __iter__(self):
        yield self.a1
        yield self.a2

或者,B.__iter__可以直接进入self.b3yield self.b3.a1以及self.b3.a2,而不是委托。