Domanda

Ho il seguente classe di base:

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, io 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 si crea un'istanza di NeuralNetworkBackPropagation vorrei che entrambi i costruttori chiamato.Questo è, non voglio ignorare la classe base' costruttore.Non python chiamata per impostazione predefinita, il costruttore della classe base nell'esecuzione di classe derivata' uno?Devo fare in modo implicito all'interno del costruttore della classe derivata?

È stato utile?

Soluzione

Non python chiamata per impostazione predefinita, la base classe costruttore quando si esegue il classe derivata' uno?Devo implicitamente farlo all'interno della derivata costruttore della classe?

No e sì.

Questo è coerente con il modo in Python gestisce altri metodi sovrascritti - è necessario chiamare in modo esplicito qualsiasi metodo della classe base che è stata ignorata se si desidera che la funzionalità per essere utilizzato in classe ereditata.

Il costruttore dovrebbe essere qualcosa di 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, si potrebbe utilizzare Python super funzione per ottenere la stessa cosa, ma è necessario essere attenti quando lo si utilizza.

Altri suggerimenti

Si dovrà mettere questo nel metodo __init__() di NeuralNetworkBackPropagation, 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 non si sovrascrive nella classe figlia. Se si sovrascrive nella classe bambino e desidera chiamare costruttore della classe del genitore così, allora dovrete farlo come ho mostrato in precedenza.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top