2009-12-12 15 views
16

Ho la seguente classe di base:Come funzionano i costruttori di classi derivate in python?

class NeuralNetworkBase: 
    def __init__(self, numberOfInputs, numberOfHiddenNeurons, numberOfOutputs): 
     self.inputLayer = numpy.zeros(shape = (numberOfInputs)) 
     self.hiddenLayer = numpy.zeros(shape = (numberOfHiddenNeurons)) 
     self.outputLayer = numpy.zeros(shape = (numberOfOutputs)) 

     self.hiddenLayerWeights = numpy.zeros(shape = (numberOfInputs, numberOfHiddenNeurons)) 
     self.outputLayerWeights = numpy.zeros(shape = (numberOfHiddenNeurons, numberOfOutputs)) 

ora, ho una classe derivata con il seguente codice:

class NeuralNetworkBackPropagation(NeuralNetworkBase): 
    def __init__(self, numberOfInputs, numberOfHiddenNeurons, numberOfOutputs): 
     self.outputLayerDeltas = numpy.zeros(shape = (numberOfOutputs)) 
     self.hiddenLayerDeltas = numpy.zeros(shape = (numberOfHiddenNeurons)) 

Ma quando un'istanza di NeuralNetworkBackPropagation mi piacerebbe che entrambi i costruttori vengono chiamati. Questo è, non voglio sovrascrivere il costruttore della classe base. Python chiama di default il costruttore della classe base quando esegue la classe derivata 'uno? Devo implicitamente farlo all'interno del costruttore della classe derivata?

risposta

25

Does chiamata python di default la base classe di quando si esegue il una classe derivata costruttore? Devo fare implicitamente farlo nel costruttore di classe derivato?

No e sì.

Questo è coerente con il modo in cui Python gestisce altri metodi sottoposti a override: è necessario chiamare esplicitamente qualsiasi metodo dalla classe base che è stato sovrascritto se si desidera che tale funzionalità venga utilizzata nella classe ereditata.

tuo costruttore dovrebbe essere simile a questo:

def __init__(self, numberOfInputs, numberOfHiddenNeurons, numberOfOutputs): 
    NeuralNetworkBase.__init__(self, numberOfInputers, numberOfHiddenNeurons, numberOfOutputs) 
    self.outputLayerDeltas = numpy.zeros(shape = (numberOfOutputs)) 
    self.hiddenLayerDeltas = numpy.zeros(shape = (numberOfHiddenNeurons)) 

In alternativa, è possibile utilizzare la funzione di Python super per ottenere la stessa cosa, ma you need to be careful when using it.

5

Si dovrà mettere questo nel metodo di NeuralNetworkBackPropagation __init__(), che è quello di chiamare il metodo __init__() della classe genitore (NeuralNetworkBase):

NeuralNetworkBase.__init__(self, numberOfInputs, numberOfHiddenNeurons, numberOfOutputs) 

Il costruttore della classe genitore è sempre chiamato automaticamente a meno che lo sovrascrivi nella classe figlio. Se lo sovrascrivi nella classe figlio e vuoi chiamare anche il costruttore della classe genitore, dovrai farlo come ho mostrato sopra.

Problemi correlati