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 回答