2015-07-16 18 views
8

Sto lavorando a una sorta di lib, e per una strana ragione ho questo errore.Impossibile istanziare la classe astratta ... con metodi astratti

  • Here è il mio codice. Naturalmente @ abc.abstractmethod devono essere commentata
  • Here sono le mie prove

Siamo spiacenti, non poteva basta copiare e incollare

sono andato sulla base del fatto che il codice qui sotto lavori

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

Nella shell Python

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

Perché per il mio modulo roster Sto avendo questo errore

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

Grazie in anticipo

risposta

13

tuo problema deriva dal fatto che è stato definito l'abstract i metodi nella classe astratta di base con __ (doppio trattino basso) anteposto. Questo fa sì che python faccia name mangling al momento della definizione delle classi.

I nomi del cambiamento funzione dal __json_builder a _Base__json_builder o __xml_builder a _Base__xml_builder. E questo è il nome che devi implementare/sovrascrivere nella sottoclasse.

Per mostrare questo comportamento nel tuo esempio -

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

Quando cambio l'attuazione a quanto segue, funziona

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

Ma questo è molto noioso, si consiglia di pensare a se vuoi veramente definire le tue funzioni con __ (doppio trattino basso). Puoi leggere ulteriori informazioni sul nome mangling here.

+0

Grazie a @AnandSKumar, è strano perché l'ho provato lol. Ho un buon amico – josuebrunel

+1

Sono l'unico, che è incappato nel messaggio di errore? Forse sono solo io, ma mi aspetterei qualcosa in questo modo: _ Non istanziare sottoclassi della classe astratta Base __without__ metodi some-method_. Questo mi ha confuso all'inizio. – quapka

+0

@quapka Penso che il messaggio di errore sembra buono. Il messaggio di errore indica che la classe SubClass ha un "metodo astratto" e non è un metodo concreto, quindi non è possibile creare un'istanza dell'oggetto. –

Problemi correlati