Analyse approfondie de l'héritage multiple en Python

巴扎黑
Libérer: 2017-08-11 15:35:36
original
1927 Les gens l'ont consulté

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()
Copier après la connexion
Exécution Le résultat :


p1-foo
p2-bar
Copier après la connexion
Dessinez 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()
Copier après la connexion
Résultat de l'exécution :


(<class &#39;__main__.D&#39;>, <class &#39;__main__.C1&#39;>, <class &#39;__main__.C2&#39;>, <class &#39;__main__.P1&#39;>, <class &#39;__main__.P2&#39;>, <type &#39;object&#39;>)

p1-foo
C2-bar
Copier après la connexion
D'après les résultats de sortie de la nouvelle classe de style ci-dessus, lorsque

instance d appelle foo(), l'ordre de recherche est D =>

Lorsque l'instance d appelle bar(), l'ordre de recherche est D => C1 => 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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal