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

高洛峰
高洛峰original
2017-03-19 15:03:031139parcourir

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)
>>> Foo().bar("Hello, Python.")
Hello, Python.

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)
>>> FooChild().bar("Hello, Python.")
Hello, Python.

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)
>>> FooChild().bar("Hello, Python.")
Hello, Python.

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()

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()

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!

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