No se puede instanciar la clase abstracta … con métodos abstractos

Estoy trabajando en una especie de lib, y por una extraña razón tengo este error.

  • Aquí está mi código. Por supuesto, @ abc.abstractmétodo debe ser sin comentarios
  • Aqui estan mis pruebas

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.