Как конструкторы производных классов работают в python?
-
19-09-2019 - |
Вопрос
У меня есть следующий базовый класс:
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 по умолчанию конструктор базового класса при запуске производного класса'one?Должен ли я неявно делать это внутри конструктора производного класса?
Решение
Вызывает ли python по умолчанию базовый конструктор класса при запуске производного класса' one?Должен ли я неявно делать это внутри производного конструктора класса?
Нет и да.
Это согласуется с тем, как 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's super
функция для достижения того же самого, но вы должны быть осторожны при его использовании.
Другие советы
Вам придется поместить это в __init__()
метод обратного распространения neuralnetworkback, то есть вызывать __init__()
метод родительского класса (NeuralNetworkBase):
NeuralNetworkBase.__init__(self, numberOfInputs, numberOfHiddenNeurons, numberOfOutputs)
Конструктор родительского класса всегда вызывается автоматически, если вы не перезапишете его в дочернем классе.Если вы перезапишете его в дочернем классе и захотите также вызвать конструктор родительского класса, то вам придется сделать это, как я показал выше.