2015-09-28 79 views
8

Ho una gerarchia di classe A < - B < - C, in B, ho bisogno di alcuni trattamenti nel costruttore, così mi si avvicinò con questo codice da questo post: Understanding Python super() with __init__() methodsErrore di profondità massima di ricorsione in Python quando si chiama init di super.

#!/usr/bin/python 

class A(object): 
    def __init__(self, v, v2): 
     self.v = v 
     self.v2 = v2 

class B(A): 
    def __init__(self, v, v2): 
     # Do some processing 
     super(self.__class__, self).__init__(v, v2) 

class C(B): 
    def hello(): 
     print v, v2 


b = B(3, 5) 
print b.v 
print b.v2 

c = C(1,2) 
print c 

Tuttavia, ho un errore di runtime dalla massima ricorsione superato

File "evenmore.py", line 12, in __init__ 
    super(self.__class__, self).__init__(v, v2) 
RuntimeError: maximum recursion depth exceeded while calling a Python object 

Cosa potrebbe essere che non va?

+0

'super (B, self)'. – ekhumoro

+0

Oppure se sei in grado di usare Python 3, semplicemente 'super()' (Python 3 riempie gli argomenti automaticamente magicamente). – ShadowRanger

risposta

6

Prima cosa da considerare: C eredita il costruttore da B (perché non è definito in C).

seconda cosa da considerare: self.__class__ in __init__ invocazione in classe C è C, non è B.

Analizziamo:

  • C().__init__ chiamate super(self.__class__, self).__init__(v, v2) che si risolve a super(C, self).__init__(v, v2) che significa B.__init__(self, v, v2).
  • Il primo argomento passato a B.__init__ ha un tipo C. super(self.__class__, self).__init__(v, v2) viene nuovamente risolto in B.__init__(self, v, v2).
  • E ancora, e ancora e ancora. E c'è la tua infinita ricorsione.
1

Assegnare il primo parametro di super come nome classe risolve questo problema.

class B(A): 
    def __init__(self, v, v2): 
     # Do some processing 
     super(B, self).__init__(v, v2) 
+0

Dovrebbe essere chiaro il motivo; 'self .__ class__' è sempre la classe concreta, non il nome di qualunque classe tu sia nella MRO. In effetti, la seconda risposta nel post che inserisci si inserisce esattamente in questo dettaglio. –