2017-05-13 1 views
1

Je suis nouveau sur python. J'essaye de comprendre la fonctionnalité super() dans l'héritage multiple de python.super() utilisation en héritage multiple en python

class B(): 
    def __init__(self): 
     print("__init__ of B called") 
     self.b = "B" 

class C(): 
    def __init__(self): 
     print("__init__ of C called") 
     self.c = "C" 

class D(B, C): 
    def __init__(self): 
     print("__init__ of D called") 
     super().__init__() 

    def output(self): 
     print(self.b, self.c) 

d = D() 
d.output() 

Je reçois l'erreur suivante:

AttributeError: 'D' object has no attribute 'c' 

Répondre

6

super() trouverez la méthode suivante dans la séquence de MRO. Cela signifie que seulement un des méthodes __init__ dans vos classes de base va être appelé.

Vous pouvez inspecter le MRO (la méthode ordre de résolution) en regardant le __mro__ attribute d'une classe:

>>> D.__mro__ 
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class 'object'>) 

afin de D, la classe suivante est B, suivie par C et object. De D.__init__(), l'expression super().__init__() appellera seulement B.__init__(), puis parce que C.__init__() est jamais appelé, self.c n'est pas non plus défini.

Vous devrez ajouter plus d'appels super() à vos implémentations de classe; il est sûr d'appeler object.__init__() sans arguments, donc il suffit de les utiliser partout ici:

class B(): 
    def __init__(self): 
     print("__init__ of B called") 
     super().__init__() 
     self.b = "B" 

class C(): 
    def __init__(self): 
     print("__init__ of C called") 
     super().__init__() 
     self.c = "C" 

class D(B, C): 
    def __init__(self): 
     print("__init__ of D called") 
     super().__init__() 

    def output(self): 
     print(self.b, self.c) 

Maintenant B.__init__ invoqueront C.__init__ et C.__init__ appellera object.__init__, et appeler D().output() œuvres:

>>> d = D() 
__init__ of D called 
__init__ of B called 
__init__ of C called 
>>> d.output() 
B C