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通过返回嵌入的可迭代来使类可迭代的主要内容,如果未能解决你的问题,请参考以下文章