2010-11-20 4 views
25

Ho codice in questo modo:Come evitare la ricorsione infinita con super()?

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 B funziona come previsto, ma un'istanza C ricorsivo infinitamente e causa un overflow dello stack. Come posso risolvere questo?

risposta

46

Quando un'istanza C chiama B.__init__, self.__class__ sarà ancora C, in modo che il super() chiamata la riporta a B.

Quando si chiama super(), utilizzare i nomi di classe direttamente. Quindi in B, chiama super(B, self), anziché super(self.__class__, self) (e, per buona misura, usa super(C, self) in C). Da Python 3, puoi semplicemente usare super() senza argomenti per ottenere la stessa cosa

+0

Prima di tutto ... chiamare init con super è un grosso problema che Internet ha deciso deve esistere. Funziona il Thomas sta descrivendo ... tuttavia, perché stai facendo funzionare un super con un init? Non è quello a cui è destinato. (Damn OK come impostazione predefinita per entrare)

Pensa solo a questo ... quando super init ... chiami l'init delle classi base, probabilmente sovrascrivendo tutto il lavoro che hai fatto. Se insisti a usare super con init, fallo correttamente. –

+0

Prof. Ebral, per favore dicci il modo corretto di usarlo se dobbiamo. – nmz787

+0

@ nmz787: la chiamata a super dovrebbe essere fatta prima di eseguire le inizializzazioni locali, le domande fanno il contrario ... Bene! Probabilmente dovrei modificare la domanda perché è una cattiva pratica e non dovrebbe essere lasciata come esempio. – kriss