2010-09-13 18 views
2

Selon la documentation sur ABCs, je devrais juste devoir ajouter une méthode next pour pouvoir sous-classer collections.Iterator. Donc, j'utilise la classe suivante:Comment est-ce que je sous-classe collections.Iterator?

class DummyClass(collections.Iterator): 
    def next(self): 
     return 1 

Cependant, je reçois une erreur lorsque je tente de instancier:

>>> x = DummyClass() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: Can't instantiate abstract class DummyClass with abstract methods __next__ 

Je devine que je fais quelque chose de stupide, mais Je ne peux pas comprendre ce que c'est. Quelqu'un peut-il nous éclairer là-dessus? Je pourrais ajouter une méthode __next__, mais j'avais l'impression que c'était seulement pour les classes C.

Répondre

6

On dirait que vous utilisez Python 3.x. Votre code fonctionne correctement sur 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)] 

Mais 3.x Python, vous devez mettre en œuvre __next__ au lieu de next, comme indiqué dans le tableau de the py3k doc. (Souvenez-vous de lire la version correcte!)

>>> 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)] 

Ce changement est introduit par PEP-3114 — Renaming iterator.next() to iterator.__next__().

+0

Comme on le voit sur [ideone] (http://ideone.com/6cxGR) – NullUserException

+0

Ce doit être un bug avec Python 2.6.1 sur Mac alors. –

+0

Juste pour clarifier mon dernier commentaire, je * suis * en cours d'exécution python 2.x. Il semble avoir été corrigé dans une version après la version fournie avec OS X. –