Erreur d’ordre de résolution de méthode
-
12-12-2019 - |
Question
C'est plus une question de curiosité qu'un problème sérieux :
Je jouais avec l'héritage multiple et je suis tombé sur ceci :
>>> class A(object):
... def __init__(self): print "A.__init__() called"
...
>>> class B(object, A): pass
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Cannot create consisten method resolution
order (MRO) for bases object, A
J'ai un TypeError
.Cependant, lorsque j'inverse l'ordre de l'héritage multiple :
>>> class B(A, object): pass
>>> b = B()
A.__init__() called
Ça fonctionne bien.J'ai supposé qu'en premier lieu, l'héritage de object
avant A
crée une sorte d’ambiguïté dans le nom.Quelqu'un voudrait-il expliquer ce qui se passe ici ?
La solution
A
est hérité de object
ou sous-classe de object
, ça ne marche pas.Le MRO garantit que les bases les plus à gauche sont visitées avant celles les plus à droite - mais il garantit également que parmi les ancêtres, si x est une sous-classe de y, alors x est visité avant y.Il est impossible de satisfaire à ces deux garanties dans ce cas
Voici une question similaire
Python:Problème avec les métaclasses en conjonction avec l'héritage multiple