Bonjour à tous
Jusqu'à présent, j'étais persuadé que super() savait gérer l'héritage multiple.
En effet, sur cet exemple...
... le résultat est le suivant
Code python : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 #!/usr/bin/python3 # -*- coding: utf-8 -*- class A: def __init__(self): print("A.init") class B(A): def __init__(self): super().__init__() print("B.init") class C(A): def __init__(self): super().__init__() print("C.init") class D(B, C): def __init__(self): super().__init__() print("D.init") xxx=D()
Cela montre qu'à l'instanciation de D, son super() appelle le init de C et de B dont il hérite (l'ordre des appels étant défini par le MRO) donc l'héritage multiple est respecté.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 A.init C.init B.init D.init
Mais si on modifie le code ainsi...
... cela donne le résultat suivant
Code python : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 #!/usr/bin/python3 # -*- coding: utf-8 -*- class B: def __init__(self): print("B.init") class C: def __init__(self): print("C.init") class D(B, C): def __init__(self): super().__init__() print("D.init") xxx=D()
A partir de là, je m'interroge. Pourquoi le super() de D n'a-t-il pas appelé le init de C dont il hérite (alors que c'était bien le cas dans l'exemple précédent) ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 B.init D.init
Si maintenant je re-modifie le code en rajoutant un super() dans tous les objets (y compris ceux de base)...
... j'obtiens un résultat plus en adéquation avec mon attente (et avec le premier code)...
Code python : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 #!/usr/bin/python3 # -*- coding: utf-8 -*- class B: def __init__(self): super().__init__() print("B.init") class C: def __init__(self): super().__init__() print("C.init") class D(B, C): def __init__(self): super().__init__() print("D.init") xxx=D()
... ce qui correspond plus à mon attente mais ouvre une nouvelle question: faut-il impérativement écrire un super() dans tous ses objets pour qu'on puisse en hériter correctement y compris en héritage multiple?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 C.init B.init D.init
Merci à tous de votre intérêt.
Partager