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

20
задан Jean-François Corbett 16 February 2018 в 12:00
поделиться

2 ответа

Вызывает ли 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 для достижения того же результата, но вы должны быть осторожны при ее использовании .

30
ответ дан 30 November 2019 в 00:09
поделиться

Вам нужно будет поместить это в метод __ init __ () NeuralNetworkBackPropagation, то есть вызвать метод __ init __ () родительского класса (NeuralNetworkBase):

NeuralNetworkBase.__init__(self, numberOfInputs, numberOfHiddenNeurons, numberOfOutputs)

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

6
ответ дан 30 November 2019 в 00:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: