2011-03-02 7 views
39

में विरासत और init विधि मैं अजगर का भिखारी हूं। मैं विरासत और __init__() समझ नहीं सकता।पाइथन

class Num: 
    def __init__(self,num): 
     self.n1 = num 

class Num2(Num): 
    def show(self): 
     print self.n1 

mynumber = Num2(8) 
mynumber.show() 

परिणाम: 8

यह ठीक है। Error. Num2 has no attribute "n1".

इस मामले में, कैसे Num2 पहुँच n1 कर सकते हैं: लेकिन मैं साथ

class Num2(Num): 
    def __init__(self,num): 
     self.n2 = num*2 
    def show(self): 
     print self.n1,self.n2 

परिणाम Num2 की जगह?

उत्तर

72

की init कॉल करने के लिए init आप भी है ओवरराइड, Num2 वर्ग Num प्रदान कर रहा है और जब से तुम को पुनर्परिभाषित नहीं कर रहे हैं Num2 में __init__() नामक विशेष विधि, इसे Num से विरासत में मिला है।

जब एक वर्ग को परिभाषित करता एक __init__() विधि, वर्ग इन्स्टेन्शियशन स्वचालित रूप से आह्वान नव निर्मित वर्ग उदाहरण के लिए __init__()

दूसरी स्थिति में, जब से तुम Num2 में __init__() को पुनर्परिभाषित कर रहे हैं आप स्पष्ट रूप से सुपर वर्ग (Num) यदि आप अपने व्यवहार का विस्तार करना चाहते में एक कॉल करने के लिए की जरूरत है।

class Num2(Num): 
    def __init__(self,num): 
     Num.__init__(self,num) 
     self.n2 = num*2 
+12

आपका उद्धरण यह समझाने के लिए पर्याप्त नहीं है कि क्यों, व्युत्पन्न-कक्षा में '' __init__'' विधि को परिभाषित नहीं करते हैं, यह विरासत में मिलता है। ऐसा इसलिए है क्योंकि _ "यदि क्लास में एक अनुरोधित विशेषता नहीं मिली है, तो खोज बेस क्लास में देखने के लिए आय प्राप्त होती है।" _ (डॉक्टर) – eyquem

+0

मुझे खेद है ... यह मूल रूप से विरासत कैसे काम करता है ... यदि आप वारिस करते हैं एक वर्ग, आपको पूरा पैकेज मिलता है, इसलिए सुपरक्लास में सब कुछ उपclass में मौजूद है। लेकिन, यदि आप किसी विधि को फिर से परिभाषित करते हैं, तो यह अतिसंवेदनशील हो जाता है ... यह आपके कोड में है। – coya

2

चूंकि आप Num.__init__ पर कॉल नहीं करते हैं, तो फ़ील्ड "एन 1" कभी नहीं बनता है। इसे बुलाओ और फिर यह वहां होगा।