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