Maison > développement back-end > Tutoriel Python > Une introduction détaillée aux fonctions et principes du super() de python

Une introduction détaillée aux fonctions et principes du super() de python

高洛峰
Libérer: 2017-03-19 15:03:03
original
1136 Les gens l'ont consulté

La définition de la méthode

object en Python est très étrange. Le premier paramètre est généralement nommé self (équivalent à cela dans d'autres langages), qui est utilisé pour passer l'objet. lui-même, et dans Il n'est pas nécessaire de le transmettre explicitement lors de l'appel, le système le transmettra automatiquement.

Le protagoniste que nous présentons aujourd'hui est super() Dans l'héritage d'une classe, super() est très couramment utilisé. Il résout certains problèmes d'appel de sous-classes. méthodes de classe parent. Le problème est que la classe parent n'est exécutée qu'une seule fois lorsqu'elle est appelée plusieurs fois, ce qui optimise la logique d'exécution. Examinons de plus près ci-dessous.

Donnez un exemple :

class Foo:
  def bar(self, message):
    print(message)
Copier après la connexion
>>> Foo().bar("Hello, Python.")
Hello, Python.
Copier après la connexion

Lorsqu'il existe une relation d'héritage, il est parfois nécessaire d'appeler la méthode de la classe parent dans la sous-classe. Le moyen le plus simple est de convertir les appels d'objet en appels de classe. Il convient de noter que le paramètre self doit être passé explicitement à ce moment-là, par exemple :

class FooParent:
  def bar(self, message):
    print(message)
class FooChild(FooParent):
  def bar(self, message):
    FooParent.bar(self, message)
Copier après la connexion
>>> FooChild().bar("Hello, Python.")
Hello, Python.
Copier après la connexion
Copier après la connexion

Il y a certains inconvénients à le faire. Ceci. Par exemple, si le nom de la classe parent est modifié, de nombreuses modifications seront impliquées dans la sous-classe. De plus, Python est un langage qui permet l'héritage multiple. La méthode présentée ci-dessus doit être écrite plusieurs fois. est un héritage multiple, ce qui est fastidieux. Afin de résoudre ces problèmes, Python a introduit le mécanisme super(). L'exemple de code est le suivant :

class FooParent:
  def bar(self, message):
    print(message)
class FooChild(FooParent):
  def bar(self, message):
    super(FooChild, self).bar(message)
Copier après la connexion
>>> FooChild().bar("Hello, Python.")
Hello, Python.
Copier après la connexion
Copier après la connexion

En apparence, le super(FooChild, self).bar(message) et la méthode FooParent.bar(self , message) sont cohérentes. En fait, les mécanismes de traitement internes de ces deux méthodes sont très différents lorsqu'il s'agit d'héritage multiple, il y aura des différences évidentes :

Code Un :

class A:
  def init(self):
    print("Enter A")
    print("Leave A")
class B(A):
  def init(self):
    print("Enter B")
    A.init(self)
    print("Leave B")
class C(A):
  def init(self):
    print("Enter C")
    A.init(self)
    print("Leave C")
class D(A):
  def init(self):
    print("Enter D")
    A.init(self)
    print("Leave D")
class E(B, C, D):
  def init(self):
    print("Enter E")
    B.init(self)
    C.init(self)
    D.init(self)
    print("Leave E")
E()
Copier après la connexion

Résultat :

Entrez E

Entrez B

Entrez A

Quitter A

Quitter B

Entrer C

Entrer A

Quitter A

Quitter C

Entrer D

Entrez A

Quitter A

Quitter D

Quitter E

La séquence d'exécution est facile à comprendre. La seule chose qui nécessite une attention est. que la classe parent publique A est exécutée plusieurs fois de second ordre.

Code 2 :

class A:
  def init(self):
    print("Enter A")
    print("Leave A")
class B(A):
  def init(self):
    print("Enter B")
    super(B, self).init()
    print("Leave B")
class C(A):
  def init(self):
    print("Enter C")
    super(C, self).init()
    print("Leave C")
class D(A):
  def init(self):
    print("Enter D")
    super(D, self).init()
    print("Leave D")
class E(B, C, D):
  def init(self):
    print("Enter E")
    super(E, self).init()
    print("Leave E")
E()
Copier après la connexion

Résultat :

Entrez E

Entrez B

Entrez C

Entrez D

Entrez A

Quitter A

Quitter D

Quitter C

Quitter B

Quitter E

Dans le super mécanisme, il est garanti que la classe parent publique n'est exécutée qu'une seule fois. Quant à l'ordre d'exécution, il est conforme au MRO (Method Résolution Order) : ordre de résolution des méthodes. Ce mécanisme MRO sera présenté en détail ultérieurement.

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