У меня есть следующий базовый класс:
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))
теперь, у меня есть производный класс со следующим кодом:
class NeuralNetworkBackPropagation(NeuralNetworkBase):
def __init__(self, numberOfInputs, numberOfHiddenNeurons, numberOfOutputs):
self.outputLayerDeltas = numpy.zeros(shape = (numberOfOutputs))
self.hiddenLayerDeltas = numpy.zeros(shape = (numberOfHiddenNeurons))
Но когда я инстанцирую NeuralNetworkBackPropagation, я хотел бы это, обоих конструкторов вызывают. Это, я не хочу переопределять конструктора базового класса. Python вызывает по умолчанию конструктора базового класса при выполнении одного производного класса? Я должен неявно сделать это в конструкторе производного класса?
Вызывает ли python по умолчанию базу конструктор класса при запуске производный класс один? Должен ли я неявно сделать это внутри производного конструктор класса?
Нет и да.
Это соответствует тому, как Python обрабатывает другие переопределенные методы - вы должны явно вызывать любой метод из базового класса, который был переопределен, если вы хотите, чтобы эта функциональность использовалась в унаследованном class.
Ваш конструктор должен выглядеть примерно так:
def __init__(self, numberOfInputs, numberOfHiddenNeurons, numberOfOutputs):
NeuralNetworkBase.__init__(self, numberOfInputers, numberOfHiddenNeurons, numberOfOutputs)
self.outputLayerDeltas = numpy.zeros(shape = (numberOfOutputs))
self.hiddenLayerDeltas = numpy.zeros(shape = (numberOfHiddenNeurons))
В качестве альтернативы вы можете использовать функцию Python super
для достижения того же результата, но вы должны быть осторожны при ее использовании .
Вам нужно будет поместить это в метод __ init __ ()
NeuralNetworkBackPropagation, то есть вызвать метод __ init __ ()
родительского класса (NeuralNetworkBase):
NeuralNetworkBase.__init__(self, numberOfInputs, numberOfHiddenNeurons, numberOfOutputs)
Конструктор родительского класса всегда вызывается автоматически, если вы не перезаписываете его в дочернем классе. Если вы перезаписываете его в дочернем классе и хотите также вызвать конструктор родительского класса, вам придется сделать это, как я показал выше.