Maison  >  Article  >  développement back-end  >  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

巴扎黑
巴扎黑original
2017-08-21 14:57:426148parcourir

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

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

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