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