4

ABCのドキュメントによると、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クラス専用の印象を受けました。

4

2 に答える 2

10

Python3.xを使用しているようです。コードはPython2.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では、py3k docの表に示されているように、の__next__代わりに実装する必要があります。(正しいバージョンを読むことを忘れないでください!)next

>>> 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__()

于 2010-09-13T19:44:32.393 に答える
2

Iteratorオブジェクトを反復可能にするために、クラスから継承する必要はありません。しかし、私の場合はそれが必要だったので、次のようにしました。

from collections.abc import Iterator

class MyIterator(Iterator):

    def __init__(self, items, property1, property2):
        self.items = items
        self.property1 = property1
        self.property2 = property2
    
    def __iter__(self):
        return self.items.__iter__()

    def __next__(self):
        return self.items.__next__()

テストコードは次のとおりです。

my_iterator = MyIterator([1, 2, 3], "value 1", 2)

for item in my_iterator:
    print(f'{item} ', end='')
print()
print(my_iterator.property1)
print(my_iterator.property2)

そして、出力は次のとおりです。

1 2 3
value 1
2

ドキュメントは次のとおりです。クラスcollections.abc.Iterator

于 2021-09-22T17:28:56.843 に答える