Python中派生类构造函数是如何工作的?

25 投票
2 回答
37239 浏览
提问于 2025-04-15 16:56

我有一个基础类,代码如下:

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会默认调用基础类的构造函数吗?我需要在派生类的构造函数里面手动调用它吗?

2 个回答

7

你需要把这个放在NeuralNetworkBackPropagation的__init__()方法里,也就是要调用父类(NeuralNetworkBase)的__init__()方法:

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

父类的构造函数会自动被调用,除非你在子类里重新定义了它。如果你在子类里重新定义了构造函数,但又想调用父类的构造函数,那你就得像我上面展示的那样去做。

40

在运行派生类的构造函数时,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 函数来实现同样的效果,但 使用时需要小心

撰写回答