Как мне сделать подкласс коллекций. Итератор? - PullRequest
2 голосов
/ 13 сентября 2010

Согласно документации на 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.

1 Ответ

6 голосов
/ 13 сентября 2010

Похоже, вы используете 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__().

...