2010-11-20 33 views
25

J'ai code comme ceci:Comment éviter la récursion infinie avec 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__() 

instanciation B fonctionne comme prévu, mais l'instanciation C récursifs infiniment et provoque un débordement de pile. Comment puis-je resoudre ceci?

Répondre

46

Lors de l'instanciation C appelle B.__init__, self.__class__ sera toujours C, de sorte que le appel super() le ramène à B.

Lorsque vous appelez super(), utilisez les noms de classe directement. Donc, dans B, appelez super(B, self), plutôt que super(self.__class__, self) (et pour faire bonne mesure, utilisez super(C, self) en C). De Python 3, vous pouvez simplement utiliser super() sans arguments pour atteindre la même chose

+0

Tout d'abord ... appel init avec super est un problème majeur que l'Internet a décidé doit exister. Cela fonctionne le Thomas décrit ... cependant, pourquoi exécutez-vous un super avec un init? Ce n'est pas ce à quoi il est destiné. (Damn OK par défaut pour entrer)

Pensez juste à ceci ... quand vous super init ... vous appelez les init de classes de base, écrasant peut-être tout le travail que vous avez fait. Si vous insistez pour utiliser super avec init, faites-le correctement. –

+0

Prof. Ebral, s'il vous plaît dites-nous la bonne façon de l'utiliser si nous devons. – nmz787

+0

@ nmz787: appel à super devrait être fait avant d'effectuer des initialisations locales, les questions le font dans l'autre sens ... Eh bien! Je devrais probablement éditer la question car c'est une mauvaise pratique et ne devrait pas être considérée comme un exemple. – kriss