Как мне подкласс.
-
02-10-2019 - |
Вопрос
Согласно документации на 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.
Решение
Похоже, вы используете 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 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-переименование iterator.next()
к iterator.__next__()
.