Bonjour à tous

Jusqu'à présent, j'étais persuadé que super() savait gérer l'héritage multiple.

En effet, sur cet exemple...
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()
... le résultat est le suivant
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
A.init
C.init
B.init
D.init
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é.

Mais si on modifie le code ainsi...
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()
... cela donne le résultat suivant
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) ?

Si maintenant je re-modifie le code en rajoutant un super() dans tous les objets (y compris ceux de base)...
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()
... j'obtiens un résultat plus en adéquation avec mon attente (et avec le premier code)...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
C.init
B.init
D.init
... 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?

Merci à tous de votre intérêt.