根据ABCs上的文档,我只需要添加next
方法即可继承collections.Iterator
。所以,我正在使用以下课程:
class DummyClass(collections.Iterator):
def next(self):
return 1
但是,当我尝试实例化它时出现错误:
>>> x = DummyClass()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class DummyClass with abstract methods __next__
我猜我正在做一些愚蠢的事,但我无法弄清楚它是什么。任何人都可以对此有所了解吗?我可以添加__next__
方法,但我的印象只适用于C类。
答案 0 :(得分:6)
看起来您正在使用Python 3.x.您的代码在Python 2.x上运行良好。
>>> import collections
>>> class DummyClass(collections.Iterator):
... def next(self):
... return 1
...
>>> x = DummyClass()
>>> zip(x, [1,2,3,4])
[(1, 1), (1, 2), (1, 3), (1, 4)]
但是在Python 3.x上,您应该实现__next__
而不是next
,如the py3k doc表所示。 (请记住阅读正确的版本!)
>>> import collections
>>> class DummyClass(collections.Iterator):
... def next(self):
... return 1
...
>>> x = DummyClass()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Can’t instantiate abstract class DummyClass with abstract methods __next__
>>> class DummyClass3k(collections.Iterator):
... def __next__(self):
... return 2
...
>>> y = DummyClass3k()
>>> list(zip(y, [1,2,3,4]))
[(2, 1), (2, 2), (2, 3), (2, 4)]
此更改由PEP-3114 — Renaming iterator.next()
to iterator.__next__()
引入。