Wie abgeleitete Klasse Bauer in Python arbeiten?
-
19-09-2019 - |
Frage
Ich habe die folgende Basisklasse:
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 habe ich 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 bekommen called.This ist, will ich nicht die Basisklasse Konstruktor außer Kraft zu setzen. Ist Python Aufruf standardmäßig ist der Basisklassenkonstruktor wenn die abgeleitete Klasse läuft ein? Muss ich es implizit tun in der abgeleiteten Klasse Konstruktor?
Lösung
Ist standardmäßig Python Aufruf der Basis Klasse Konstruktor, wenn der Lauf abgeleiteten Klasse ein? Muss ich implizit tun es innerhalb der abgeleiteten Klassenkonstruktors?
Nein und ja.
Dies ist im Einklang mit der Art und Weise Python anderen überschriebenen Methoden behandelt -. Sie müssen ausdrücklich jede Methode aus der Basisklasse aufrufen, die außer Kraft gesetzt worden ist, wenn Sie diese Funktionalität wollen in der vererbten Klasse verwendet werden
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 können Sie Python super
Funktion verwenden, um die gleiche Sache zu erreichen, aber müssen Sie vorsichtig sein, wenn es verwendet wird.
Andere Tipps
Sie müssen diese von NeuralNetworkBackPropagation im __init__()
Methode setzen, also die __init__()
Methode der Elternklasse aufzurufen (NeuralNetworkBase):
NeuralNetworkBase.__init__(self, numberOfInputs, numberOfHiddenNeurons, numberOfOutputs)
Der Konstruktor der übergeordneten Klasse wird immer automatisch, wenn Sie überschreiben es in der untergeordneten Klasse. Wenn Sie es in der untergeordneten Klasse überschreiben und wollen auch der Eltern-Klasse Konstruktor aufzurufen, dann musst du es tun, wie ich oben zeigte.