Question

J'ai la classe de base suivante:

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

maintenant, j'ai une classe dérivée avec le code suivant:

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

Mais quand j'instancier NeuralNetworkBackPropagation Je voudrais que les deux constructeurs se called.This est, je ne veux pas passer outre la classe de base constructeur. Est-ce que l'appel de python par défaut, le constructeur de la classe de base lors de l'exécution de la classe dérivée un? Dois-je faire implicitement dans le constructeur de la classe dérivée?

Était-ce utile?

La solution

  

Est-ce que l'appel python par défaut la base   constructeur de la classe lors de l'exécution de la   classe dérivée un? Dois-je   faire implicitement à l'intérieur du dérivé   constructeur de la classe?

Non et oui.

Ceci est cohérent avec la façon dont Python gère d'autres méthodes surchargées -. Vous devez appeler explicitement toute méthode de la classe de base qui a été remplacée si vous voulez que la fonctionnalité à utiliser dans la classe héritée

Votre constructeur devrait ressembler à ceci:

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

Vous pouvez utiliser la fonction super Python pour obtenir la même chose, mais vous devez être prudent lorsque vous l'utilisez .

Autres conseils

Vous devrez mettre cela dans la méthode __init__() de NeuralNetworkBackPropagation, qui est d'appeler la méthode __init__() de la classe parente (NeuralNetworkBase):

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

Le constructeur de la classe parente est toujours appelée automatiquement à moins que vous écrasez dans la classe des enfants. Si vous écrasez dans la classe des enfants et que vous voulez appeler le constructeur de la classe du parent ainsi, alors vous devrez le faire comme je l'ai montré ci-dessus.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top