Maison > Article > développement back-end > Compréhension approfondie de l'héritage multiple en python
Cet article présente principalement des informations pertinentes sur la compréhension de l'héritage multiple en Python. Voici des exemples pour vous aider à apprendre et à vous référencer. Les amis dans le besoin peuvent se référer à
python Comprendre l'héritage multiple
Python, comme C++, prend en charge l'héritage multiple. Bien que le concept soit simple, la tâche difficile est que si une sous-classe appelle un attribut qui n'est pas défini par elle-même, dans quel ordre va-t-elle à la classe parent pour le trouver, en particulier lorsque de nombreuses classes parent contiennent l'attribut avec le même nom. L'ordre de recherche des attributs est différent pour les classes classiques et les classes de nouveau style. Regardons maintenant les deux performances différentes de la classe classique et de la nouvelle classe respectivement :Classe classique :
#! /usr/bin/python # -*- coding:utf-8 -*- class P1(): def foo(self): print 'p1-foo' class P2(): def foo(self): print 'p2-foo' def bar(self): print 'p2-bar' class C1(P1,P2): pass class C2(P1,P2): def bar(self): print 'C2-bar' class D(C1,C2): pass if __name__ =='__main__': d=D() d.foo() d.bar()Exécution Le résultat :
p1-foo p2-barDessinez une image de l'exemple de code pour une compréhension facile : De ci-dessus À en juger par les résultats de sortie de la classe classique, lorsque l'instance d appelle foo(), l'ordre de recherche est D => C1 => P1, lorsque l'instance d appelle bar() , l'ordre de recherche L'ordre est D => C1 => P1 => P2
Résumé : La méthode de recherche classique consiste à rechercher les attributs de manière "de gauche à droite, en profondeur d'abord". . d recherche d'abord s'il a une méthode foo. Sinon, il recherche si la méthode existe dans la classe parent la plus proche C1. Sinon, il continue la recherche vers le haut jusqu'à ce que la méthode soit trouvée dans P1 et la recherche se termine. .
Nouvelle classe de style :
#! /usr/bin/python # -*- coding:utf-8 -*- class P1(object): def foo(self): print 'p1-foo' class P2(object): def foo(self): print 'p2-foo' def bar(self): print 'p2-bar' class C1(P1,P2): pass class C2(P1,P2): def bar(self): print 'C2-bar' class D(C1,C2): pass if __name__ =='__main__': print D.__mro__ #只有新式类有__mro__属性,告诉查找顺序是怎样的 d=D() d.foo() d.bar()Résultat de l'exécution :
(<class '__main__.D'>, <class '__main__.C1'>, <class '__main__.C2'>, <class '__main__.P1'>, <class '__main__.P2'>, <type 'object'>) p1-foo C2-barÀ en juger par les résultats de sortie de la classe de nouveau style ci-dessus, lorsque instance d appelle foo(), l'ordre de recherche est D => ; P1Lorsque l'instance d appelle bar(), l'ordre de recherche est D => C1 => C2
Résumé : La méthode de recherche pour les classes de nouveau style est de utilisez la méthode « en largeur d'abord » pour rechercher une propriété.
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!