Ответ 1
Ваша проблема возникает из-за того, что вы определили абстрактные методы в базовом абстрактном классе с добавлением __
(double underscore). Это приводит к тому, что python выполняет манипуляцию имени во время определения классов.
Имена функции изменяются с __json_builder
на _Base__json_builder
или __xml_builder
на _Base__xml_builder
. И это имя, которое вы должны реализовать/перезаписать в своем подклассе.
Чтобы показать это поведение в вашем примере -
>>> 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 "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class SubClass with abstract methods _Base__whatever
Когда я меняю реализацию на следующую, она работает
>>> class SubClass(Base):
... def __init__(self):
... super(Base, self).__init__()
... self._Base__whatever()
... def _Base__whatever(self):
... print("whatever")
...
>>> a = SubClass()
whatever
Но это очень утомительно, вы можете подумать, хотите ли вы определить свои функции с помощью __
(double underscore). Вы можете прочитать больше о названии коверкая здесь.