23

私は次の基本クラスを持っています:

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))

これで、次のコードを持つ派生クラスができました。

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

しかし、NeuralNetworkBackPropagationをインスタンス化するときに、両方のコンストラクターが呼び出されるようにしたいのです。つまり、基本クラスのコンストラクターをオーバーライドしたくありません。派生クラスのコンストラクターを実行するときに、Pythonはデフォルトで基本クラスのコンストラクターを呼び出しますか?派生クラスのコンストラクター内で暗黙的に実行する必要がありますか?

4

2 に答える 2

36

派生クラスのコンストラクターを実行するときに、Pythonはデフォルトで基本クラスのコンストラクターを呼び出しますか?派生クラスのコンストラクター内で暗黙的に実行する必要がありますか?

いいえ、はい。

これは、Pythonが他のオーバーライドされたメソッドを処理する方法と一致しています。継承されたクラスでその機能を使用する場合は、オーバーライドされた基本クラスからメソッドを明示的に呼び出す必要があります。

コンストラクターは次のようになります。

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

または、Pythonのsuper関数を使用して同じことを実現することもできますが、使用するときは注意が必要です

于 2009-12-12T04:22:28.000 に答える
7

これ__init__()をNeuralNetworkBackPropagationのメソッドに入れる必要があります。つまり__init__()、親クラス(NeuralNetworkBase)のメソッドを呼び出す必要があります。

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

親クラスのコンストラクターは、子クラスで上書きしない限り、常に自動的に呼び出されます。子クラスで上書きし、親のクラスコンストラクターも呼び出したい場合は、上記のように行う必要があります。

于 2009-12-12T04:21:39.343 に答える