Die Definition von Objektmethoden in Python ist normalerweise „self“ (entspricht diesem in anderen Sprachen) und wird verwendet, um das Objekt selbst zu übergeben. Das System wird automatisch übertragen.
Der Protagonist, den wir heute vorstellen, ist super(). Super() wird sehr häufig bei der Klassenvererbung verwendet. Es löst einige Probleme, wenn die übergeordnete Klasse mehrmals aufgerufen wird Einmal ausgeführt, die Ausführungslogik optimiert, schauen wir uns das unten im Detail an.
Geben Sie ein Beispiel:
class Foo: def bar(self, message): print(message)
Wenn eine Vererbungsbeziehung besteht, ist es manchmal erforderlich, die Methode der übergeordneten Klasse in der Unterklasse aufzurufen Zu diesem Zeitpunkt besteht die einfachste Methode darin, den Objektaufruf in einen Klassenaufruf umzuwandeln. Zu beachten ist, dass der Parameter self zu diesem Zeitpunkt explizit übergeben werden muss, zum Beispiel:
>>> Foo().bar("Hello, Python.") Hello, Python.
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 übergeordnete Klassenname geändert wird, sind mehrere Änderungen erforderlich Darüber hinaus ist Python eine Sprache, die Mehrfachvererbung ermöglicht. Die oben gezeigte Methode muss mehrfach geschrieben werden, 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)
Oberflächlich betrachtet sind die Ergebnisse der Methode super(FooChild, self).bar(message) und der Methode FooParent.bar(self, message) konsistent . Tatsächlich sind die Ergebnisse der beiden Methoden die gleichen. Wenn es um Mehrfachvererbung geht, gibt es offensichtliche Unterschiede:
>>> FooChild().bar("Hello, Python.") Hello, Python.
Code 1:
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
Die Ausführungssequenz ist leicht zu verstehen. Das Einzige, was Aufmerksamkeit erfordert, ist, dass die öffentliche übergeordnete Klasse A mehrmals ausgeführt wird .
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
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.