2015-07-16 2 views
8

Я работаю над своего рода lib, и по какой-то странной причине у меня есть эта ошибка.Невозможно создать абстрактный класс ... с абстрактными методами

  • Here - мой код. Конечно @ abc.abstractmethod должны раскомментировать
  • Here мои тесты

К сожалению, не мог просто скопировать и вставить его

Я пошел на основании того, что код ниже работ

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

В питона оболочки

>>> from test import * 
>>> s = SubClass() 
whatever 

Почему мой список модуля я имею эту ошибку

Can't instantiate abstract class Player with abstract methods _Base__json_builder, _Base__xml_builder 

Заранее спасибо

ответ

13

Ваш вопрос приходит, потому что вы определили абстрактный методы в базовом абстрактном классе с __ (двойное подчеркивание). Это приводит к тому, что python делает name mangling во время определения классов.

Названия изменения функции от __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 

Но это очень утомительно, вы можете о том, если думать вы действительно хотите определить свои функции с помощью __ (двойное подчеркивание). Вы можете узнать больше об имени mangling here.

+0

Спасибо @AnandSKumar, это странно, потому что я попробовал LOL. У меня хороший друг – josuebrunel

+1

Я единственный, кто наткнулся на сообщение об ошибке? Возможно, это только я, но я бы ожидал чего-то в этом направлении: _ Не создавайте подкласс абстрактного класса Base __without__ методами some-method_. Сначала это смутило меня. – quapka

+0

@квапка Я думаю, что сообщение об ошибке кажется прекрасным. Сообщение об ошибке указывает, что класс SubClass имеет «абстрактный метод» и его не конкретный метод, поэтому мы не можем создать экземпляр объекта. –

Смежные вопросы