2010-11-20 17 views
25

Ich habe Code wie folgt aus:Wie vermeidet man unendliche Rekursion mit 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__() 

Instanziierungsanwendung B funktioniert wie erwartet, aber Instanziieren C rekursiv unendlich und verursacht einen Stapelüberlauf. Wie kann ich das lösen?

Antwort

46

Wenn Instanziieren C ruft B.__init__, self.__class__ wird noch C, so dass die super() Aufruf bringt es

nach B zurück

Wenn Super() aufrufen, direkt die Klassennamen verwenden. Also in B, rufen Sie super(B, self) statt super(self.__class__, self) (und für ein gutes Maß, verwenden Sie super(C, self) in C). Von Python 3, können Sie einfach super() ohne Argumente, um das gleiche zu erreichen

+0

Zunächst einmal ... Call-Init mit Super ist ein großes Problem, das das Internet entschieden hat, muss existieren. Es funktioniert der Thomas beschreibt ... aber warum machst du einen Super mit einer Init? Dafür ist es nicht gedacht. (Damn OK als Standard für die Eingabe)

Denken Sie nur daran ... wenn Sie Super-Init ... nennen Sie die Basisklassen init, möglicherweise überschreiben alle Arbeiten, die Sie getan haben. Wenn Sie darauf bestehen, super mit init zu verwenden, tun Sie es richtig. –

+0

Prof. Ebral, bitte sagen Sie uns den richtigen Weg, um es zu benutzen, wenn wir müssen. – nmz787

+0

@ nmz787: Aufruf an Super sollte getan werden, bevor lokale Initialisierungen durchgeführt werden, die Fragen tun es andersherum ... Nun! Ich sollte die Frage wahrscheinlich bearbeiten, da es eine schlechte Übung ist und nicht als Beispiel übrig bleiben sollte. – kriss

Verwandte Themen