2009-12-12 20 views
16

मेरे पास निम्न बेस क्लास है:व्युत्पन्न वर्ग निर्माता कैसे पाइथन में काम करते हैं?

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 को तुरंत चालू करता हूं, तो मैं चाहता हूं कि दोनों रचनाकारों को बुलाया जाए। यह है, मैं बेस क्लास 'कन्स्ट्रक्टर को ओवरराइड नहीं करना चाहता हूं। क्या व्युत्पन्न वर्ग 'एक चलाते समय डिफ़ॉल्ट रूप से बेस क्लास कन्स्ट्रक्टर का पाइथन कॉल करता है? क्या मुझे व्युत्पन्न वर्ग कन्स्ट्रक्टर के अंदर निहित रूप से ऐसा करना है?

उत्तर

25

डिफ़ॉल्ट रूप से अजगर कॉल करता है आधार वर्ग निर्माता के जब व्युत्पन्न वर्ग 'एक चल रहा है? क्या मुझे पर व्युत्पन्न क्लास कन्स्ट्रक्टर के अंदर यह करना है?

नहीं और हाँ।

यह पाइथन अन्य ओवरराइड विधियों को संभालने के तरीके के अनुरूप है - यदि आप विरासत वर्ग में उस कार्यक्षमता का उपयोग करना चाहते हैं तो आपको बेस क्लास से किसी भी विधि को स्पष्ट रूप से कॉल करना होगा।

आपका निर्माता कुछ इस तरह दिखना चाहिए:

def __init__(self, numberOfInputs, numberOfHiddenNeurons, numberOfOutputs): 
    NeuralNetworkBase.__init__(self, numberOfInputers, numberOfHiddenNeurons, numberOfOutputs) 
    self.outputLayerDeltas = numpy.zeros(shape = (numberOfOutputs)) 
    self.hiddenLayerDeltas = numpy.zeros(shape = (numberOfHiddenNeurons)) 

वैकल्पिक रूप से, आप पायथन के super समारोह इस्तेमाल कर सकते हैं एक ही बात है, लेकिन you need to be careful when using it प्राप्त करने के लिए।

5

आप NeuralNetworkBackPropagation की __init__() विधि में इस डाल करने के लिए होगा, कि (NeuralNetworkBase) माता-पिता वर्ग के __init__() विधि कॉल करने के लिए है आप इसे बाल वर्ग में ओवरराइट करते हैं। यदि आप इसे बाल वर्ग में ओवरराइट करते हैं और माता-पिता के वर्ग कन्स्ट्रक्टर को भी कॉल करना चाहते हैं, तो आपको ऊपर दिखाए गए अनुसार इसे करना होगा।

संबंधित मुद्दे