Subclass collections.iteratorをサブクラス化するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/3703825

質問

文書によると ABCS, 、aを追加する必要があります 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クラスのみの印象を受けていました。

役に立ちましたか?

解決

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, 、の表に示されているように PY3Kドキュメント. 。 (正しいバージョンを読むことを忘れないでください!)

>>> 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 - 改名 iterator.next()iterator.__next__().

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top