2009-12-12 9 views
16

Ich habe die folgende Basisklasse:Wie funktionieren abgeleitete Klassenkonstruktoren in 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)) 

jetzt, ich habe eine abgeleitete Klasse mit dem folgenden Code:

class NeuralNetworkBackPropagation(NeuralNetworkBase): 
    def __init__(self, numberOfInputs, numberOfHiddenNeurons, numberOfOutputs): 
     self.outputLayerDeltas = numpy.zeros(shape = (numberOfOutputs)) 
     self.hiddenLayerDeltas = numpy.zeros(shape = (numberOfHiddenNeurons)) 

Aber wenn ich NeuralNetworkBackPropagation instanziiert Ich möchte, dass beide Konstrukteure aufgerufen. Das heißt, ich möchte den Konstruktor der Basisklasse nicht überschreiben. Ruft Python standardmäßig den Basisklassenkonstruktor auf, wenn er die abgeleitete Klasse 'one' ausführt? Muss ich es implizit innerhalb des abgeleiteten Klassenkonstruktors tun?

Antwort

25

Ist standardmäßig Python Aufruf der Basis Klasse Konstruktor, wenn die abgeleiteten Klasse ein Lauf? Muss ich implizit tun es innerhalb der abgeleiteten Klasse Konstruktor?

Nein und ja.

Dies steht im Einklang mit der Art und Weise, wie Python andere überschriebene Methoden behandelt - Sie müssen explizit jede Methode aus der Basisklasse aufrufen, die überschrieben wurde, wenn diese Funktionalität in der geerbten Klasse verwendet werden soll.

Ihr Konstruktor sollte wie folgt aussehen:

def __init__(self, numberOfInputs, numberOfHiddenNeurons, numberOfOutputs): 
    NeuralNetworkBase.__init__(self, numberOfInputers, numberOfHiddenNeurons, numberOfOutputs) 
    self.outputLayerDeltas = numpy.zeros(shape = (numberOfOutputs)) 
    self.hiddenLayerDeltas = numpy.zeros(shape = (numberOfHiddenNeurons)) 

Alternativ Sie super Funktion des Python verwenden könnte das gleiche zu erreichen, aber you need to be careful when using it.

5

Sie werden diese von NeuralNetworkBackPropagation im __init__() Verfahren haben zu setzen, also die __init__() Methode der Elternklasse aufzurufen (NeuralNetworkBase):

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

Der Konstruktor der übergeordneten Klasse immer automatisch aufgerufen wird, es sei denn, Sie überschreiben es in der Kindklasse. Wenn Sie es in der Kindklasse überschreiben und den Klassenkonstruktor des Elternteils aufrufen wollen, müssen Sie es wie oben gezeigt tun.