我在python中有一个类,它有一个可迭代的实例变量.我想通过迭代嵌入式迭代来迭代类的实例.
我实现如下:
def __iter__(self):
return self._iterable.__iter__()
Run Code Online (Sandbox Code Playgroud)
我觉得__iter__()在iterable上调用方法并不是很舒服,因为它是一种特殊的方法.这是你如何在python中解决这个问题,还是有更优雅的解决方案?
Dav*_*ver 23
委派方式的"最佳"方式__iter__是:
def __iter__(self):
return iter(self._iterable)
Run Code Online (Sandbox Code Playgroud)
或者,可能值得了解:
def __iter__(self):
for item in self._iterable:
yield item
Run Code Online (Sandbox Code Playgroud)
哪个会让你在返回之前摆弄每个项目(例如,如果你想要的话yield item * 2).
正如@Lattyware在评论中提到的那样,PEP380(计划包含在Python 3.3中)将允许:
def __iter__(self):
yield from self._iterable
Run Code Online (Sandbox Code Playgroud)
请注意,执行以下操作可能很诱人:
def __init__(self, iterable):
self.__iter__ = iterable.__iter__
Run Code Online (Sandbox Code Playgroud)
但这不起作用:直接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])
Run Code Online (Sandbox Code Playgroud)
你会期望list(SurprisingIter())会返回["a", "b", "c"],但它实际上会返回[1, 2, 3].
| 归档时间: |
|
| 查看次数: |
3481 次 |
| 最近记录: |