2009-12-12 42 views
16

我有以下的基類:派生類構造函數如何在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在運行派生類'one'時默認調用基類構造函數嗎?我是否必須在派生類的構造函數中隱式地執行它?

回答

25

默認情況下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函數來實現同樣的事情,但you need to be careful when using it

5

你將不得不把這個NeuralNetworkBackPropagation的__init__()方法,即調用父類的__init__()方法(NeuralNetworkBase):

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

父類的構造函數總是自動除非叫你將它覆蓋在子類中。如果你在子類中覆蓋它並且想要調用父類的構造函數,那麼你必須按照上面所示的方法來完成它。

相關問題