programacion - ¿Cómo funcionan los constructores de clases derivadas en python?
programacion orientada a objetos python pdf (2)
Tengo la siguiente clase 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))
Ahora, tengo una clase derivada con el siguiente código:
class NeuralNetworkBackPropagation(NeuralNetworkBase):
def __init__(self, numberOfInputs, numberOfHiddenNeurons, numberOfOutputs):
self.outputLayerDeltas = numpy.zeros(shape = (numberOfOutputs))
self.hiddenLayerDeltas = numpy.zeros(shape = (numberOfHiddenNeurons))
Pero cuando hago una instancia de NeuralNetworkBackPropagation, me gustaría que llamaran a ambos constructores. Esto es, no quiero anular el constructor de la clase base. ¿Python llama por defecto al constructor de la clase base cuando ejecuta el de la clase derivada? ¿Tengo que hacerlo implícitamente dentro del constructor de la clase derivada?
¿Python llama por defecto al constructor de la clase base cuando ejecuta el de la clase derivada? ¿Tengo que hacerlo implícitamente dentro del constructor de la clase derivada?
No y sí.
Esto es consistente con la forma en que Python maneja otros métodos sobrescritos: debe llamar explícitamente a cualquier método de la clase base que haya sido anulada si desea que esa funcionalidad se use en la clase heredada.
Su constructor debe verse algo como esto:
def __init__(self, numberOfInputs, numberOfHiddenNeurons, numberOfOutputs):
NeuralNetworkBase.__init__(self, numberOfInputers, numberOfHiddenNeurons, numberOfOutputs)
self.outputLayerDeltas = numpy.zeros(shape = (numberOfOutputs))
self.hiddenLayerDeltas = numpy.zeros(shape = (numberOfHiddenNeurons))
Alternativamente, puedes usar la super
función de Python para lograr lo mismo, pero debes tener cuidado al usarla .
Tendrá que poner esto en el __init__()
de NeuralNetworkBackPropagation, es decir, llamar al __init__()
de la clase primaria (NeuralNetworkBase):
NeuralNetworkBase.__init__(self, numberOfInputs, numberOfHiddenNeurons, numberOfOutputs)
El constructor de la clase principal siempre se llama automáticamente a menos que lo sobrescriba en la clase secundaria. Si lo sobrescribe en la clase secundaria y también desea llamar al constructor de clases de los padres, deberá hacerlo como se muestra arriba.