派生类构造函数如何在 python 中工作?

Posted

技术标签:

【中文标题】派生类构造函数如何在 python 中工作?【英文标题】:How do derived class constructors work in python? 【发布时间】:2010-12-25 22:09:40 【问题描述】:

我有以下基类:

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】:

你必须把它放在NeuralNetworkBackPropagation的__init__()方法中,即调用父类(NeuralNetworkBase)的__init__()方法:

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

父类的构造函数总是自动调用,除非你在子类中覆盖它。如果你在子类中覆盖它并且还想调用父类的构造函数,那么你必须按照我上面显示的那样做。

【讨论】:

【参考方案2】:

默认情况下python是否调用base 运行时的类构造函数 派生类的一个?我一定要吗 在派生的内部隐式执行 类构造函数?

不是和是的。

这与 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 函数来实现相同的目的,但 you need to be careful when using it。

【讨论】:

以上是关于派生类构造函数如何在 python 中工作?的主要内容,如果未能解决你的问题,请参考以下文章

我如何使函数在派生类中工作?

覆盖 CObList MFC 的复制构造函数

如何从派生类复制构造函数调用基类复制构造函数? [复制]

C++中的派生类,可以不定义对象直接调用基类的成员和调用自己的成员函数嘛???

变量 args SFINAE 默认构造函数在 clang 中工作,但在 Visual Studio 2015 中失败

C ++派生类构造函数[关闭]