2010-11-20 13 views
25

मैं इस तरह कोड है:सुपर() के साथ अनंत रिकर्सन से कैसे बचें?

class A(object): 
    def __init__(self): 
      self.a = 1 

class B(A): 
    def __init__(self): 
     self.b = 2 
     super(self.__class__, self).__init__() 

class C(B): 
    def __init__(self): 
     self.c = 3 
     super(self.__class__, self).__init__() 

instantiating बी के रूप में की उम्मीद है, लेकिन instantiating सी असीम recursed काम करता है और एक ढेर अतिप्रवाह कारण बनता है। इसे कैसे हल किया जा सकता है?

उत्तर

46

जब instantiating सी कॉल B.__init__, self.__class__ अभी भी सी होगी, इसलिए सुपर() कॉल इसे वापस लाता बी

जब सुपर (कह कर बुलाया), सीधे वर्ग नामों का उपयोग। तो बी में, super(B, self) पर कॉल करें, super(self.__class__, self) के बजाय (और अच्छी माप के लिए, सी में super(C, self) का उपयोग करें)। पायथन 3 से, आप केवल उसी चीज को प्राप्त करने के लिए सुपर() का उपयोग कर सकते हैं

+0

सबसे पहले ... सुपर के साथ कॉल इनिट एक बड़ी समस्या है जिसे इंटरनेट ने तय किया है। यह काम करता है थॉमस वर्णन कर रहा है ... हालांकि, आप एक init के साथ एक सुपर क्यों चल रहे हैं? यही वह नहीं है जिसका उद्देश्य है। (प्रवेश के लिए डिफ़ॉल्ट के रूप में ठीक है)

बस इसके बारे में सोचें ... जब आप सुपर इनिट ... आप बेस क्लास इनिट को कॉल करते हैं, संभवतः आपके द्वारा किए गए सभी कार्यों को ओवरराइट करते हैं। यदि आप init के साथ सुपर उपयोग पर जोर देते हैं, तो इसे सही तरीके से करें। –

+0

प्रो। एब्रल, अगर हमें जरूरी है तो कृपया इसका इस्तेमाल करने का सही तरीका बताएं। – nmz787

+0

@ nmz787: स्थानीय प्रारंभिक प्रदर्शन करने से पहले सुपर को कॉल किया जाना चाहिए, सवाल यह दूसरी तरफ है ... अच्छा! मुझे शायद इस सवाल को संपादित करना चाहिए क्योंकि यह खराब अभ्यास है और उदाहरण के रूप में नहीं छोड़ा जाना चाहिए। – kriss

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