python通过返回嵌入式iterable使类可迭代

时间:2012-03-05 20:35:47

标签: python iterable

我在python中有一个类,它有一个可迭代的实例变量。我想通过迭代嵌入式迭代来迭代类的实例。

我按如下方式实现了这个:

def __iter__(self):
    return self._iterable.__iter__()

我觉得在iterable上调用__iter__()方法并不是很舒服,因为它是一种特殊的方法。这是你如何在python中解决这个问题,还是有一个更优雅的解决方案?

1 个答案:

答案 0 :(得分:23)

委派__iter__的“最佳”方式是:

def __iter__(self):
    return iter(self._iterable)

或者,可能值得了解:

def __iter__(self):
    for item in self._iterable:
        yield item

在返回之前,您可以放弃每个项目(例如,如果您需要yield item * 2)。

正如@Lattyware在评论中提到的那样,PEP380(计划包含在Python 3.3中)将允许:

def __iter__(self):
    yield from self._iterable

请注意,执行以下操作可能很诱人:

def __init__(self, iterable):
    self.__iter__ = iterable.__iter__

但是此无效iter(foo)直接调用__iter__上的type(foo)方法,绕过foo.__iter__。例如,考虑一下:

class SurprisingIter(object):
    def __init__(self):
        self.__iter__ = lambda self: iter("abc")

    def __iter__(self):
        return iter([1, 2, 3])

您希望list(SurprisingIter())返回["a", "b", "c"],但实际上会返回[1, 2, 3]