Ceci est détaillé avec une quantité raisonnable de détail par Guido lui-même à http://python-history.blogspot.com/2010/06/method-resolution-order.html (y compris les deux précédentes tentatives).
Mais, brièvement: dans votre exemple, le Tiers() appellera First.__init__
. Pour de telles situations simples, Python va chercher l'attribut (dans ce cas, __init__
) sur la classe de ses parents, de gauche à droite. Donc, si vous définissez
class Third(First, Second):
...
Python look au Premier abord, et, si le Premier n'a pas l'attribut, en Seconde.
Cette situation devient plus complexe lorsque l'héritage commence les chemins de passage (par exemple, si le Premier a hérité de la Deuxième, par exemple). Lire le lien ci-dessus pour plus de détails, mais, en bref, Python va essayer de maintenir l'ordre dans lequel chaque classe apparaît sur la liste d'héritage, les enfants des classes de première.
Ainsi, par exemple, si vous avez eu:
class First(object):
def __init__(self):
print "first"
class Second(First):
def __init__(self):
print "second"
class Third(First):
def __init__(self):
print "third"
class Fourth(Second, Third):
def __init__(self):
super(Fourth, self).__init__()
print "that's it"
le MRO [Quatrième, Deuxième, Troisième, Première].
En passant: si Python ne peut pas trouver une méthode cohérente de résolution de l'ordre, il faudra lever une exception, au lieu de revenir à un comportement qui peut surprendre l'utilisateur.
Édité à l'ajout de l'exemple de l'ambiguïté d'un MRO:
class First(object):
def __init__(self):
print "first"
class Second(First):
def __init__(self):
print "second"
class Third(First, Second):
def __init__(self):
print "third"
Devrait Troisième du MRO [Premier, Deuxième] ou [Deuxième, pour la Première fois? Il n'y a pas de façon évidente de l'attente, et Python génère une erreur:
TypeError: Erreur lors de l'appel de la
métaclasse bases
Ne peut pas créer une méthode de résolution de l'ordre (MRO) pour les bases
Seconde, Première