dev*_*ium 20 python constructor base-class derived-class
我有以下基类:
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))
Run Code Online (Sandbox Code Playgroud)
现在,我有一个派生类,代码如下:
class NeuralNetworkBackPropagation(NeuralNetworkBase):
def __init__(self, numberOfInputs, numberOfHiddenNeurons, numberOfOutputs):
self.outputLayerDeltas = numpy.zeros(shape = (numberOfOutputs))
self.hiddenLayerDeltas = numpy.zeros(shape = (numberOfHiddenNeurons))
Run Code Online (Sandbox Code Playgroud)
但是当我实例化NeuralNetworkBackPropagation时,我希望两个构造函数都被调用.这是,我不想覆盖基类的构造函数.在运行派生类'one时,python默认调用基类构造函数吗?我是否必须在派生类构造函数中隐式执行此操作?
ShZ*_*ShZ 30
在运行派生类'one时,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))
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用Python的super函数来实现相同的功能,但在使用它时需要小心.
你必须把它放在__init__()NeuralNetworkBackPropagation 的方法中,即调用__init__()父类的方法(NeuralNetworkBase):
NeuralNetworkBase.__init__(self, numberOfInputs, numberOfHiddenNeurons, numberOfOutputs)
Run Code Online (Sandbox Code Playgroud)
除非您在子类中覆盖它,否则始终会自动调用父类的构造函数.如果你在子类中覆盖它并想要调用父类的构造函数,那么你必须按照我上面的说明去做.