2015-09-28 4 views
8

Ich habe eine Klassenhierarchie A < - B < - C, in B, ich brauche einige Verarbeitung in dem Konstruktor, so kam ich mit diesem Code von diesem Posten bis: Understanding Python super() with __init__() methodsMaximaler Rekursionstiefehler in Python beim Aufruf von super's init.

#!/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 
jedoch

, ich habe eine Laufzeitfehler von maximaler Rekursion überschritten

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

Was könnte falsch sein?

+0

'super (B, selbst)'. – ekhumoro

+0

Oder wenn Sie in der Lage sind Python 3 zu verwenden, nur 'super()' (Python 3 füllt die Argumente auto-magisch). – ShadowRanger

Antwort

6

Zuerst zu beachten: C erbt Konstruktor von B (weil es nicht in C definiert ist).

Zweite Sache zu prüfen: self.__class__ in __init__ Aufruf in C-Klasse C, nicht B.

Wir analysieren:

  • C().__init__ Anrufe super(self.__class__, self).__init__(v, v2), die an super(C, self).__init__(v, v2) die B.__init__(self, v, v2) bedeutet gelöst ist.
  • Das erste Argument, das an B.__init__ übergeben wurde, hat einen Typ C. super(self.__class__, self).__init__(v, v2) wird erneut in B.__init__(self, v, v2) aufgelöst.
  • Und wieder und wieder und wieder. Und da ist deine unendliche Rekursion.
1

Geben Sie den ersten Parameter von Super als Klassenname löst dieses Problem.

+0

Es sollte klar sein, warum; 'self .__ class__' ist immer die konkrete Klasse, nicht der Name der Klasse, in der Sie sich im MRO befinden. In der Tat, die zweite Antwort in dem Post, auf den Sie verlinken, geht genau darauf ein. –