Maison > développement back-end > Tutoriel Python > Explication détaillée de l'utilisation et du principe de fonctionnement de la fonction super() en python

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

巴扎黑
Libérer: 2017-08-21 14:57:42
original
6175 Les gens l'ont consulté

La définition des méthodes objet 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 transmettre l'objet lui-même. Il n'a pas besoin d'être passé explicitement lors de l'appel, le système transférera automatiquement.

Le protagoniste que nous présentons aujourd'hui est super(). Super() est très couramment utilisé dans l'héritage de classe. Il résout certains problèmes des sous-classes appelant des méthodes de classe parent, lorsque la classe parent est appelée plusieurs fois. exécuté une fois, optimisé la logique d'exécution, examinons en détail 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. l'héritage, 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'un 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 à noter 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