2009-12-12 15 views
16

tengo la siguiente clase base:¿Cómo funcionan los constructores de clase derivados en 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)) 

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 instanciar NeuralNetworkBackPropagation me gustaría que los dos constructores las llaman. Esto es, no quiero anular el constructor de la clase base. ¿Pitón llama por defecto al constructor de la clase base cuando ejecuta la clase derivada? ¿Debo hacerlo implícitamente dentro del constructor de clase derivado?

Respuesta

25

funciona la llamada pitón de manera predeterminada la base de la clase cuando se ejecuta el una clase derivada constructor? ¿Tengo que implícitamente hacerlo dentro del constructor de clase derivado?

No y sí.

Esto es coherente con la forma en que Python maneja otros métodos anulados: debe llamar explícitamente a cualquier método de la clase base que se haya anulado si desea que esa funcionalidad se use en la clase heredada.

Su constructor debe ser 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)) 

Como alternativa, puede utilizar la función de Python super para lograr la misma cosa, pero you need to be careful when using it.

5

Usted tendrá que poner esto en el método de NeuralNetworkBackPropagation __init__(), es llamar al método __init__() de la clase padre (NeuralNetworkBase):

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

El constructor de la clase padre siempre se llama automáticamente a menos lo sobreescribes en la clase infantil. Si lo sobreescribe en la clase secundaria y también desea llamar al constructor de clase del padre, tendrá que hacerlo como lo mostré arriba.

Cuestiones relacionadas