Как конструкторы производных классов работают в python?

StackOverflow https://stackoverflow.com/questions/1892269

Вопрос

У меня есть следующий базовый класс:

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)

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top