Como derivado construtores de classe trabalhar em python?
-
19-09-2019 - |
Pergunta
Eu tenho a seguinte classe base:
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))
Agora, eu tenho uma classe derivada com o seguinte código:
class NeuralNetworkBackPropagation(NeuralNetworkBase):
def __init__(self, numberOfInputs, numberOfHiddenNeurons, numberOfOutputs):
self.outputLayerDeltas = numpy.zeros(shape = (numberOfOutputs))
self.hiddenLayerDeltas = numpy.zeros(shape = (numberOfHiddenNeurons))
Mas quando eu instanciar NeuralNetworkBackPropagation eu gostaria que ambos os construtores obter called.This é, eu não quero substituir o construtor da classe base. Faz apelo python por padrão, o construtor da classe base está ao executar a classe derivada? Eu tenho que fazê-lo implicitamente dentro do construtor da classe derivada?
Solução
põe python por padrão a base construtor da classe é durante a execução do classe derivada one? Eu tenho que implicitamente fazê-lo dentro do derivado construtor da classe?
Não e sim.
Isto é consistente com a maneira Python lida com outros métodos de substituição -. Você tem que chamar explicitamente qualquer método da classe base que tem sido substituído, se você quiser que a funcionalidade para ser usado na classe herdada
Seu construtor deve ser algo como isto:
def __init__(self, numberOfInputs, numberOfHiddenNeurons, numberOfOutputs):
NeuralNetworkBase.__init__(self, numberOfInputers, numberOfHiddenNeurons, numberOfOutputs)
self.outputLayerDeltas = numpy.zeros(shape = (numberOfOutputs))
self.hiddenLayerDeltas = numpy.zeros(shape = (numberOfHiddenNeurons))
Como alternativa, você poderia usar href="http://docs.python.org/library/functions.html#super" rel="noreferrer"> super
função do Python para conseguir a mesma coisa, mas você precisa ter cuidado ao usá-lo .
Outras dicas
Você vai ter que colocar isso no método __init__()
de NeuralNetworkBackPropagation, que é chamar o método __init__()
da classe pai (NeuralNetworkBase):
NeuralNetworkBase.__init__(self, numberOfInputs, numberOfHiddenNeurons, numberOfOutputs)
O construtor da classe pai sempre é chamado automaticamente, a menos que você substituí-lo na classe infantil. Se você substituí-lo na classe infantil e deseja chamar construtor da classe do pai, bem, então você vai ter que fazê-lo como eu mostrei acima.