我在python中有一个类,它有一个可迭代的实例变量。我想通过迭代嵌入式迭代来迭代类的实例。
我按如下方式实现了这个:
def __iter__(self):
return self._iterable.__iter__()
我觉得在iterable上调用__iter__()
方法并不是很舒服,因为它是一种特殊的方法。这是你如何在python中解决这个问题,还是有一个更优雅的解决方案?
答案 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]
。