2012-10-03 13 views
21

विस्तार करने के लिए मैं एक आधार वर्ग बनाया है:कैसे अजगर वर्ग init

class Thing(): 
    def __init__(self, name): 
     self.name = name 

मैं कक्षा का विस्तार करने और init विधि में जोड़ें ताकि SubThing दोनों एक name और एक time संपत्ति है करना चाहते हैं। मैं यह कैसे करुं?

class SubThing(Thing): 
    # something here to extend the init and add a "time" property 

    def __repr__(self): 
     return '<%s %s>' % (self.name, self.time) 

कोई भी मदद शानदार होगी।

उत्तर

27

तुम बस उपवर्ग में __init__ को परिभाषित करने और super फोन माता-पिता की __init__ तरीकों उचित रूप से कॉल करने के लिए कर सकते हैं:

class SubThing(Thing): 
    def __init__(self, *args, **kwargs): 
     super(SubThing, self).__init__(*args, **kwargs) 
     self.time = datetime.now() 

करें कि आपका आधार वर्ग उपवर्ग super के रूप में, हालांकि object से करना सुनिश्चित पुरानी शैली के वर्गों के साथ काम नहीं करेगा:

class Thing(object): 
    ... 
+14

'सुपर' में 'सबथिंग' को संदर्भित करने के बजाय, आप 'सुपर (स्वयं .__ वर्ग__, स्वयं) .__ init __ (* args, ** kwargs) कर सकते हैं। यह 'प्रकार() 'का उपयोग करके गतिशील रूप से बनाए गए वर्गों के साथ भी काम करता है। – miki725

+3

मुझे यह त्रुटि उन समाधानों में से किसी एक के साथ मिलती है: 'TypeError: टाइप होना चाहिए, classobj नहीं' - त्रुटि मेरी सुपर लाइन द्वारा ट्रिगर की गई है। – TheChymera

+1

@TheChymera देखें कि जेसी ने क्या लिखा था: "सुनिश्चित करें कि ऑब्जेक्ट से आपकी बेस क्लास सबक्लास है, क्योंकि सुपर पुराने शैली के वर्गों के साथ काम नहीं करेगा" – Acsisr

1

आपको विधि SubThing में विधि लिखनी चाहिए और उसके बाद अपने क्षेत्र को आरंभ करने के लिए सुपरक्लास के निर्माता को कॉल करना चाहिए।

This Q&A should provide you some more examples.