web-dev-qa-db-ja.com

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

21

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 関数を使用して同じことを実現することもできますが、 使用するときは注意が必要です

34
ShZ

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

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

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