Подтвердить что ты не робот

Как конструкторы производных классов работают в 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 по умолчанию конструктор базового класса при запуске производного класса "один"? Должен ли я неявно делать это внутри конструктора производного класса?

Спасибо Благодаря

4b9b3361

Ответ 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)

Конструктор родительского класса всегда вызывается автоматически, если вы не перезапишете его в дочернем классе. Если вы перепишете его в дочернем классе и хотите вызвать конструктор родительского класса, то вам придется сделать это, как я показал выше.