Maison  >  Article  >  développement back-end  >  méthode super() en Python

méthode super() en Python

不言
不言original
2018-06-01 16:36:221529parcourir

Cet article présente principalement la méthode super() en Python, qui a une certaine valeur de référence. Maintenant, je la partage avec vous. Les amis dans le besoin peuvent s'y référer

Super est utilisé pour résoudre plusieurs problèmes d'héritage Oui. , appeler la méthode de classe parent directement en utilisant le nom de la classe ne pose aucun problème lors de l'utilisation de l'héritage unique, mais si l'héritage multiple est utilisé, cela entraînera divers problèmes tels que l'ordre de recherche (MRO) et les appels répétés (héritage diamant). Cet article vous présente principalement les informations pertinentes sur la méthode super() en Python. Les amis qui en ont besoin peuvent s'y référer.

Préface

Les classes Python incluent des classes de nouveau style et des classes classiques, qui prennent toutes deux en charge l'héritage multiple. Dans l'héritage de classe, si vous souhaitez remplacer la méthode de classe parent au lieu de remplacer la méthode de classe parent, nous pouvons actuellement utiliser la méthode super() pour obtenir

Le langage Python et C++ ont un héritage de classe similaire, quand la classe est définie, le premier self sera personnalisé en Python, similaire au pointeur this en C++, pointant vers l'objet lui-même.

Exemple de classes Python simples :

>>> class hello(object): 
...     def print_c(): 
...       print"hello world!" 
>>> hello().print_c() 
hello world!

Bien sûr, en pratique, l'héritage de classe est inévitable, la sous-classe hérite de la classe parent, normalement comme suit :

>>> class child(hello): 
...     def print_c(self): 
...         hello().print_c() 
...          
>>> child().print_c() 
hello world!

Le mécanisme super() est également fourni en python, l'exemple est le suivant suit :

>>> class hello(object): 
...     def print_c(self): 
...       print"hello world!" 
...        
>>> class child(hello): 
...     def print_c(self): 
...         super(child,self).print_c() 
...          
>>> child().print_c() 
hello world!

Remarque

Pré-Python2.2 versions : Ère de la classe classique (classe classique)

Une classe classique est une classe sans héritage. Les types d'instance sont tous des types de type Si une classe classique est utilisée comme classe parent, la sous-classe retournera. lors de l'appel du constructeur de la classe parent. Une telle erreur '''TypeError: doit être de type, pas classobj'''

À l'heure actuelle, la méthode MRO est DFS (recherche en profondeur en premier (enfant ordre des nœuds : de gauche à droite)). Par conséquent, des classes de nouveau style sont utilisées dans cet article, et l'algorithme de recherche des classes de nouveau style est l'algorithme C3

class C(object):
 def minus(self,x):
  return x/2

class D(C):
 def minus(self,x):
  super(D, self).minus()
  print 'hello'

Dans le code ci-dessus, C est la classe parent, D est une sous-classe. Nous avons redéfini la méthode moins dans la classe D, qui consiste à ajouter une nouvelle fonction d'impression 'hello' basée sur les fonctions de la classe C. Le rôle de super ici est d'appeler la méthode de la classe parent dans la sous-classe. C'est également une utilisation courante de l'appel de super() en héritage simple. Alors voici la question

class A(object):
 def __init__(self):
  self.n = 10

 def minus(self, m):
  self.n -= m


class B(A):
 def __init__(self):
  self.n = 7

 def minus(self, m):
  super(B,self).minus(m)
  self.n -= 2
b=B()
b.minus(2)
print b.n

Alors, quelle est la sortie de b.n dans le code ci-dessus ? Pourquoi le résultat est-il 2 au lieu de 5 ? super(B,self).minus(m) appelle clairement la méthode moins de la classe parent, mais le résultat de sortie est 2. Vous devez comprendre que l'instance actuelle de B n'est pas une instance de A, donc la valeur de self .n passé C'est 7, pas 10.

Alors, comment fonctionne le super lorsqu'il y a un héritage multiple ? Allez, créez maintenant une classe C qui hérite de A, puis créez une classe D qui hérite de B et C. Découvrez comment appeler la méthode super remplacée.

class C(A):
 def __init__(self):
  self.n = 12

 def minus(self, m):
  super(C,self).minus(m)
  self.n -= 5


class D(B, C):
 def __init__(self):
  self.n = 15

 def minus(self, m):
  super(D,self).minus(m)
  self.n -= 2

d=D()
d.minus(2)
print d.n

Quel est le résultat de sortie du code ci-dessus ? Ne soyez pas impatient, voyez d'abord comment cela fonctionne. Comme mentionné ci-dessus, la nouvelle classe utilise l'algorithme C3 lors de la recherche de nœuds enfants. Alors comment le trouve-t-on ? D->B->C->A->objet. Comment puis-je vérifier que cette commande est correcte ?

D.__mro__
(<class &#39;__main__.D&#39;>, <class &#39;__main__.B&#39;>, <class &#39;__main__.C&#39;>, <class &#39;__main__.A&#39;>, <type &#39;object&#39;>)

Qu'est-ce que Mro ? Pour chaque classe que vous définissez, Python calculera une liste d'ordre de résolution de méthode (MRO), qui représente l'ordre d'héritage de classe.

Recommandations associées :

Explication détaillée de l'utilisation et du principe de fonctionnement de la fonction super() en python

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!

Déclaration:
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