Die Definition der Methode
object in Python ist sehr seltsam. Der erste Parameter heißt im Allgemeinen self (entspricht diesem in anderen Sprachen) und wird zur Übergabe des Objekts verwendet selbst, und es besteht keine Notwendigkeit, es beim Aufruf explizit zu übergeben, das System übergibt es automatisch.
Der Protagonist, den wir heute vorstellen, ist super(). Bei der Vererbung einer Klasse wird super() sehr häufig verwendet. Es löst einige Probleme beim Aufruf von Unterklassen Das Problem besteht darin, dass die übergeordnete Klasse bei mehreren Aufrufen nur einmal ausgeführt wird, was die Ausführungslogik optimiert.
Geben Sie ein Beispiel:
class Foo: def bar(self, message): print(message)
>>> Foo().bar("Hello, Python.") Hello, Python.
Wenn eine Vererbungsbeziehung besteht, ist es manchmal erforderlich, die Methode der übergeordneten Klasse in der Unterklasse aufzurufen Der einfachste Weg besteht darin, Objektaufrufe in Klassenaufrufe umzuwandeln. Es ist zu beachten, dass der Parameter self zu diesem Zeitpunkt explizit übergeben werden muss, zum Beispiel:
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.
Dies hat einige Nachteile Wenn beispielsweise der Name der übergeordneten Klasse geändert wird, sind viele Änderungen an der Unterklasse erforderlich. Darüber hinaus ist Python eine Sprache, die eine Mehrfachvererbung ermöglicht Vererbung, was umständlich ist. Um diese Probleme zu lösen, hat Python den super()-Mechanismus eingeführt. Der Beispielcode lautet wie folgt:
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.
Oberflächlich betrachtet ist super(FooChild, self).bar(message). Methode und FooParent.bar(self , message) Methode sind tatsächlich sehr unterschiedlich. Wenn es um Mehrfachvererbung geht, gibt es direkt ein Beispiel:
Code Eins:
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()
Ergebnis:
E eingeben
B eingeben
A eingeben
A verlassen
B verlassen
C eingeben
A eingeben
A verlassen
C verlassen
D eingeben
Geben Sie A ein
Verlassen Sie A
Verlassen Sie D
Verlassen Sie E
Die Ausführungssequenz ist leicht zu verstehen. Das Einzige, was Aufmerksamkeit erfordert dass die öffentliche übergeordnete Klasse A mehrfach ausgeführt wird. Zweitklassig.
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()
Ergebnis:
E eingeben
B eingeben
C eingeben
D eingeben
A eingeben
A verlassen
D verlassen
C verlassen
B verlassen
E verlassen
Im Supermechanismus wird garantiert, dass die öffentliche übergeordnete Klasse nur einmal ausgeführt wird. Die Ausführungsreihenfolge entspricht der MRO (Method Resolution Order): Methodenauflösungsreihenfolge. Dieser MRO-Mechanismus wird später ausführlich vorgestellt.
Das obige ist der detaillierte Inhalt vonEine detaillierte Einführung in die Funktionen und Prinzipien von Pythons super(). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!