Introduction
L'héritage multiple présente un défi unique lors de la détermination du parent méthode à invoquer à l’aide de la fonction super(). Cet article explore le comportement de super() dans de tels scénarios, en se concentrant sur son interaction avec l'ordre de résolution de méthode (MRO).
Super() et invocation de méthode parent
Lors de l'utilisation de super() avec héritage multiple, il fait référence à la méthode de la classe parent qui se trouve en premier dans le MRO. Par exemple, dans l'extrait de code ci-dessous :
class First(object): def __init__(self): print("first") class Second(object): def __init__(self): print("second") class Third(First, Second): def __init__(self): super(Third, self).__init__() print("that's it")
Le MRO pour Third est [Third, First, Second, object]. Par conséquent, super().__init__() dans Third fait référence à First.__init__.
Ordre de résolution de méthode (MRO)
Le MRO détermine l'ordre dans lequel Python recherche pour les méthodes et les attributs hérités des classes parentes. En général, le MRO répertorie en premier la classe enfant, suivie de ses parents tels qu'ils sont répertoriés dans la définition de la classe.
Dans l'exemple ci-dessus, le MRO est [Troisième, Premier, Deuxième, objet]. Cet ordre est utilisé pour résoudre les appels de méthode et les recherches d'attributs, en commençant par Third et en descendant dans l'arborescence des classes parent.
Personnalisation et ambiguïté
Alors que Python construit généralement le MRO automatiquement, il est possible de le personnaliser grâce à l'attribut mro. Cependant, il est important de s'assurer que le MRO est sans ambiguïté. Si ce n'est pas le cas, Python déclenchera une exception.
Considérez le MRO ambigu suivant :
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")
Le MRO de Third devrait-il être [First, Second] ou [Second, First] ? Il n'y a pas d'attente claire, donc Python génère une erreur :
TypeError: Error when calling the metaclass bases Cannot create a consistent method resolution order (MRO) for bases Second, First
Comprendre MRO
Pour comprendre pleinement comment super() interagit avec l'héritage multiple, il est crucial appréhender le concept de MRO. En comprenant les règles régissant la construction et la résolution des MRO, les développeurs peuvent utiliser efficacement super() et éviter les conflits potentiels dans plusieurs scénarios d'héritage.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!