Estoy trabajando en una especie de lib, y por una extraña razón tengo este error.
Lo siento no podría simplemente copiarlo y pegarlo
Fui sobre la base de que el siguiente código funciona
test.py
import abc import six @six.add_metaclass(abc.ABCMeta) class Base(object): @abc.abstractmethod def whatever(self,): raise NotImplementedError class SubClass(Base): def __init__(self,): super(Base, self).__init__() self.whatever() def whatever(self,): print("whatever")
En la concha de python
>>> from test import * >>> s = SubClass() whatever
¿Por qué para mi módulo de lista tengo este error?
Can't instantiate abstract class Player with abstract methods _Base__json_builder, _Base__xml_builder
Gracias por adelantado
Su problema se debe a que ha definido los métodos abstractos en su clase de base abstracta con __
(subrayado doble) antepuesto. Esto hace que Python haga gestos de nombres en el momento de la definición de las clases.
Los nombres de la función cambian de __json_builder
a _Base__json_builder
o __xml_builder
a _Base__xml_builder
. Y este es el nombre que debe implementar / sobrescribir en su subclase.
Para mostrar este comportamiento en tu ejemplo:
>>> import abc >>> import six >>> @six.add_metaclass(abc.ABCMeta) ... class Base(object): ... @abc.abstractmethod ... def __whatever(self): ... raise NotImplementedError ... >>> class SubClass(Base): ... def __init__(self): ... super(Base, self).__init__() ... self.__whatever() ... def __whatever(self): ... print("whatever") ... >>> a = SubClass() Traceback (most recent call last): File "", line 1, in TypeError: Can't instantiate abstract class SubClass with abstract methods _Base__whatever
Cuando cambio la implementación a la siguiente, funciona
>>> class SubClass(Base): ... def __init__(self): ... super(Base, self).__init__() ... self._Base__whatever() ... def _Base__whatever(self): ... print("whatever") ... >>> a = SubClass() whatever
Pero esto es muy tedioso, es posible que desee pensar si realmente desea definir sus funciones con __
(subrayado doble). Puedes leer más sobre la mutilación de nombres aquí .
Este error aparece en el código fuente de python. Es por eso que no vemos la línea de excepción real.
PyErr_Format(PyExc_TypeError, "Can't instantiate abstract class %s " "with abstract methods %U", type->tp_name, joined);
He clonado el código fuente de Python desde Github. Esto es del archivo typeobject.c.