python通过返回嵌入的可迭代来使类可迭代

Posted

技术标签:

【中文标题】python通过返回嵌入的可迭代来使类可迭代【英文标题】:python make class iterable by returning embedded iterable 【发布时间】:2012-03-23 08:02:02 【问题描述】:

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

我是这样实现的:

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

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

【问题讨论】:

您可能需要关注 PEP 380 (python.org/dev/peps/pep-0380),这将使yield from self._iterable 成为可能(这已被接受包含在 3.3 中)。 【参考方案1】:

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

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

另外,可能值得了解:

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

这可以让您在退货之前摆弄每件商品(例如,如果您想要 yield item * 2)。

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

def __iter__(self):
    yield from self._iterable

请注意,这样做可能很诱人:

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

但这行不通iter(foo) 直接在type(foo) 上调用__iter__ 方法,绕过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]

【讨论】:

PEP380 变体中有一个错字,我更喜欢。应该是def __iter__(self): yield from self._iterable

以上是关于python通过返回嵌入的可迭代来使类可迭代的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Python 内置的“all”函数为空的可迭代对象返回 True?

python的可迭代对象和迭代器

python的可迭代对象和迭代器

搞懂python中的可迭代对象和迭代器对象(即迭代器)

python中的迭代器有啥用

Python基础之迭代器