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