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!