Python中派生类构造函数是如何工作的?
我有一个基础类,代码如下:
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))