2015-07-16 28 views
8

Ich arbeite an einer Art von Lib, und aus einem seltsamen Grund habe ich diesen Fehler.Kann abstrakte Klasse nicht instanziieren ... mit abstrakten Methoden

  • Here ist mein Code. Natürlich @ abc.abstractmethod habe meine Tests uncommented
  • Here sind

Leider kopieren nicht nur und es

ich auf der Basis ging einfügen könnte sein, dass der Code unten Werke

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

In der Python-Shell

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

Warum für meine Roster Modul habe ich diesen Fehler

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

Vielen Dank im Voraus

Antwort

13

Ihre Frage kommt, weil Sie die abstrakt definiert haben Methoden in Ihrer Basis abstrakten Klasse mit __ (Doppelunterstrich) vorangestellt. Dies bewirkt, dass Python zum Zeitpunkt der Definition der Klassen name mangling tut.

Die Namen der Funktion Wechsel von __json_builder zu _Base__json_builder oder __xml_builder zu _Base__xml_builder. Und das ist der Name, den Sie in Ihrer Unterklasse implementieren/überschreiben müssen.

dieses Verhalten in Ihrem Beispiel zeigen -

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

Als ich die Umsetzung der folgenden ändern, es funktioniert

>>> class SubClass(Base): 
...  def __init__(self): 
...    super(Base, self).__init__() 
...    self._Base__whatever() 
...  def _Base__whatever(self): 
...    print("whatever") 
... 
>>> a = SubClass() 
whatever 

Aber das ist sehr mühsam, können Sie darüber nachdenken, wenn Sie möchten Ihre Funktionen wirklich mit __ (doppelter Unterstrich) definieren. Sie können mehr über den Namen Mangling here lesen.

+0

Dank @AnandSKumar, es ist komisch, weil ich es ausprobiert lol. Einen guten Kumpel haben – josuebrunel

+1

Bin ich der Einzige, der auf die Fehlermeldung gestoßen ist? Vielleicht bin ich es nur, aber ich würde etwas in dieser Richtung erwarten: _Unterklasse der abstrakten Klasse nicht instanziieren Base __without__ Methoden some-method_. Das hat mich zuerst verwirrt. – quapka

+0

@quapka Ich denke, die Fehlermeldung scheint in Ordnung. Die Fehlermeldung zeigt an, dass die SubClass-Klasse eine 'abstrakte Methode' hat, und es ist keine konkrete Methode, daher können wir ein Objekt davon nicht instanziieren. –