Comment dérivés constructeurs de classe en Python?
-
19-09-2019 - |
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?
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.