Pregunta

De acuerdo con la documentación sobre ABC , yo debería tener que agregar un método next para poder collections.Iterator subclase. Por lo tanto, estoy usando la siguiente clase:

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

Sin embargo, me sale un error al intentar crear una instancia:

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

supongo que estoy haciendo algo estúpido, pero no puedo averiguar lo que es. ¿Alguien puede arrojar algo de luz sobre esto? Podría añadir un método __next__, pero yo tenía la impresión de que era sólo para las clases C.

¿Fue útil?

Solución

Parece que están utilizando Python 3.x Su código funciona bien en 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)]

Pero en Python 3.x, debe implementar __next__ en lugar de next, como se muestra en la tabla de la py3k doc . (Recuerde leer la versión correcta!)

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

Este cambio se introduce por PEP-3114 - Cambiar el nombre de iterator.next() a iterator.__next__() .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top