Python では派生クラスのコンストラクターはどのように機能しますか? 質問する

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

現在、次のコードを持つ派生クラスがあります。

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

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

ベストアンサー1

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同じことを達成する機能ですが、使用時には注意が必要です

おすすめ記事