2015-09-28 34 views
8

Mam klasy hierarchii < - B < - C, w B, muszę trochę przetworzeniu w konstruktorze, więc wymyśliłem tego kodu z tego postu: Understanding Python super() with __init__() methodsMaksymalny błąd głębokości rekursji w Pythonie podczas wywoływania super-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 

Jednak mam błąd runtime z maksymalnej rekursji przekroczył

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

Co może być nie tak?

+0

'Super (B, self)'. – ekhumoro

+0

Lub jeśli potrafisz używać Pythona 3, po prostu 'super()' (Python 3 automatycznie wypełnia argumenty). – ShadowRanger

Odpowiedz

6

Pierwsza rzecz do rozważenia: C dziedziczy konstruktor od B (ponieważ nie jest zdefiniowany w C).

Druga sprawa do rozważenia: self.__class__ w __init__ inwokacja w klasie C to C, a nie B.

Przeanalizujmy:

  • C().__init__ rozmowy super(self.__class__, self).__init__(v, v2) który rozdziela się na super(C, self).__init__(v, v2) co oznacza B.__init__(self, v, v2).
  • Pierwszy argument przekazany do B.__init__ ma typ C. super(self.__class__, self).__init__(v, v2) został ponownie rozstrzygnięty na B.__init__(self, v, v2).
  • I znowu, i znowu, i znowu. I jest twoja nieskończona rekursja.
1

Podając pierwszy parametr super jak nazwa klasy rozwiązuje ten problem.

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

Powinno być jasne, dlaczego; 'self .__ class__' to zawsze konkretna klasa, a nie nazwa jakiejkolwiek klasy w MRO. W rzeczywistości druga odpowiedź z wpisu, do którego linkujesz, jest dokładnie taka sama. –

Powiązane problemy