Question

Selon la documentation sur ABCs, Je devrais avoir à ajouter une méthode next pour être en mesure de sous-classe collections.Iterator. Donc, j'utilise la classe suivante:

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 qu'elle est. Quelqu'un peut-il faire la lumière à ce sujet? Je pourrais ajouter une méthode __next__, mais j'avais l'impression qui était que pour les classes C.

Était-ce utile?

La solution

On dirait que vous utilisez Python 3.x. Votre code fonctionne très bien 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 le Py3K doc . (Rappelez-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 - Changement de nom iterator.next() à iterator.__next__() .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top