12

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

我实现了如下:

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

我真的觉得__iter__()在可迭代对象上调用该方法不太舒服,因为它是一种特殊方法。这是你将如何在 python 中解决这个问题还是有更优雅的解决方案?

4

1 回答 1

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]

于 2012-03-05T20:36:49.890 回答