2010-09-13 5 views
2

Согласно документации на ABCs, я должен просто добавить метод next, чтобы иметь возможность подкласса collections.Iterator. Таким образом, я использую следующий класс:Как подклассы collection.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.

ответ

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

+0

Как видно на [ideone] (http://ideone.com/6cxGR) – NullUserException

+0

Это, должно быть, ошибка с Python 2.6.1 на Mac. –

+0

Просто, чтобы уточнить мой последний комментарий, я * am * running python 2.x. Кажется, он был исправлен в версии после версии, которая поставляется с OS X. –

 Смежные вопросы

  • Нет связанных вопросов^_^