派生类构造函数如何在 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 中工作?的主要内容,如果未能解决你的问题,请参考以下文章
C++中的派生类,可以不定义对象直接调用基类的成员和调用自己的成员函数嘛???