Vererbung ist nützlich, aber Sie können ihr volles Potenzial ausschöpfen, indem Sie Code aus Basisklassen wiederverwenden.

Die zentralen Thesen

  • Mit der super()-Funktion von Python können Sie Superklassenmethoden aus einer Unterklasse aufrufen und so die Implementierung von Vererbung und Methodenüberschreibung vereinfachen.
  • Die Funktion super() steht in engem Zusammenhang mit der Method Resolution Order (MRO) in Python, die die Reihenfolge bestimmt, in der Vorfahrenklassen nach Methoden oder Attributen durchsucht werden.
  • Die Verwendung von super() in Klassenkonstruktoren ist eine gängige Praxis, um gemeinsame Attribute in der übergeordneten Klasse und spezifischere Attribute in der untergeordneten Klasse zu initialisieren. Wenn super() nicht verwendet wird, kann dies zu unbeabsichtigten Folgen führen, z. B. zu fehlenden Attributinitialisierungen.

Eine der Kernfunktionen von Python ist das OOP-Paradigma, mit dem Sie reale Entitäten und ihre Beziehungen modellieren können.

Wenn Sie mit Python-Klassen arbeiten, verwenden Sie häufig Vererbung und überschreiben die Attribute oder Methoden einer Oberklasse. Python bietet eine

instagram viewer
super() Funktion, mit der Sie die Methoden der Oberklasse aus der Unterklasse aufrufen können.

Was ist super() und warum brauchen Sie es?

Mithilfe der Vererbung können Sie eine neue Python-Klasse erstellen, die die Funktionen einer vorhandenen Klasse erbt. Sie können auch Methoden der Oberklasse in der Unterklasse überschreiben und so alternative Implementierungen bereitstellen. Möglicherweise möchten Sie die neue Funktionalität jedoch zusätzlich zur alten und nicht anstelle dieser verwenden. In diesem Fall, super() ist nützlich.

Du kannst den... benutzen super() Funktion, um auf Superklassenattribute zuzugreifen und Methoden der Superklasse aufzurufen. Super ist wichtig für Objekt orientierte Programmierung weil es die Implementierung von Vererbung und Methodenüberschreibung erleichtert.

Wie funktioniert super()?

Im Inneren, super() steht in engem Zusammenhang mit der Reihenfolge der Methodenauflösung (MRO) in Python, die der C3-Linearisierungsalgorithmus bestimmt.

Hier ist wie super() funktioniert:

  1. Bestimmen Sie die aktuelle Klasse und Instanz: Wenn du anrufst super() Innerhalb einer Methode einer Unterklasse ermittelt Python automatisch die aktuelle Klasse (die Klasse, die die aufgerufene Methode enthält). super()) und die Instanz dieser Klasse (d. h. selbst).
  2. Bestimmen Sie die Oberklasse: super() benötigt zwei Argumente – die aktuelle Klasse und die Instanz – die Sie nicht explizit übergeben müssen. Anhand dieser Informationen wird die Oberklasse ermittelt, an die der Methodenaufruf delegiert werden soll. Dies geschieht durch die Untersuchung der Klassenhierarchie und des MRO.
  3. Rufen Sie die Methode in der Superklasse auf: Sobald die Oberklasse bestimmt ist, super() ermöglicht es Ihnen, seine Methoden so aufzurufen, als würden Sie sie direkt aus der Unterklasse aufrufen. Dadurch können Sie Methoden erweitern oder überschreiben, während Sie weiterhin die ursprüngliche Implementierung der Oberklasse verwenden.

Verwendung von super() in einem Klassenkonstruktor

Benutzen super() in einem Klassenkonstruktor ist gängige Praxis, da Sie häufig gemeinsame Attribute in der übergeordneten Klasse und spezifischere in der untergeordneten Klasse initialisieren möchten.

Um dies zu demonstrieren, Definieren Sie eine Python-Klasse, Vater, was ein Sohn Klasse erbt von:

classFather:
def__init__(self, first_name, last_name):
self.first_name = first_name
self.last_name = last_name

classSon(Father):
def__init__(self, first_name, last_name, age, hobby):
# Call the parent class constructor (Father)
super().__init__(first_name, last_name)

self.age = age
self.hobby = hobby

defget_info(self):
returnf"Son's Name: {self.first_name}{self.last_name}, \
Son's Age: {self.age}, Son's Hobby: {self.hobby}"

# Create an instance of the Son class
son = Son("Pius", "Effiong", 25, "Playing Guitar")

# Access attributes
print(son.get_info())

Im Inneren Sohn Konstruktor, der Aufruf von super().init() ruft die auf Vater Klassenkonstruktor und übergibt ihn Vorname Und Familienname, Nachname als Parameter. Dadurch wird sichergestellt, dass die Vater Die Klasse kann die Namensattribute auch auf a immer noch korrekt festlegen Sohn Objekt.

Wenn Sie nicht anrufen super() In einem Klassenkonstruktor wird der Konstruktor seiner übergeordneten Klasse nicht ausgeführt. Dies kann zu unbeabsichtigten Folgen führen, wie z. B. fehlenden Attributinitialisierungen oder einer unvollständigen Einrichtung des Status der übergeordneten Klasse:

...
classSon(Father):
def__init__(self, first_name, last_name, age, hobby):
self.age = age
self.hobby = hobby
...

Wenn Sie jetzt versuchen, die anzurufen Informationen bekommen Methode, es wird eine ausgelöst AttributeError weil das self.first_name Und self.last_name Attribute wurden nicht initialisiert.

Verwendung von super() in Klassenmethoden

Sie können verwenden super() in anderen Methoden, abgesehen von Konstruktoren, auf die gleiche Weise. Dadurch können Sie das Verhalten der Methode der Oberklasse erweitern oder überschreiben.

classFather:
defspeak(self):
return"Hello from Father"

classSon(Father):
defspeak(self):
# Call the parent class's speak method using super()
parent_greeting = super().speak()
returnf"Hello from Son\n{parent_greeting}"

# Create an instance of the Son class
son = Son()

# Call the speak method of the Son class
son_greeting = son.speak()

print(son_greeting)

Der Sohn Klasse erbt von der Vater und hat seine sprechen Methode. Der sprechen Methode der Sohn Klasse verwendet super().speak() das anrufen sprechen Methode der Vater Klasse. Dies ermöglicht es, die Nachricht der übergeordneten Klasse einzuschließen und sie gleichzeitig um eine spezifische Nachricht der untergeordneten Klasse zu erweitern.

Nicht verwendbar super() in einer Methode, die eine andere überschreibt, bedeutet, dass die in der übergeordneten Klassenmethode vorhandene Funktionalität nicht wirksam wird. Dies führt zu einer vollständigen Ersetzung des Methodenverhaltens, was zu einem Verhalten führen kann, das Sie nicht beabsichtigt haben.

Reihenfolge der Methodenauflösung verstehen

Method Resolution Order (MRO) ist die Reihenfolge, in der Python Vorfahrenklassen durchsucht, wenn Sie auf eine Methode oder ein Attribut zugreifen. MRO hilft Python dabei, zu bestimmen, welche Methode aufgerufen werden soll, wenn mehrere Vererbungshierarchien vorhanden sind.

classNigeria():
defculture(self):
print("Nigeria's culture")

classAfrica():
defculture(self):
print("Africa's culture")

Folgendes passiert, wenn Sie eine Instanz von erstellen Lagos Klasse und rufe die an Kultur Methode:

  1. Python beginnt mit der Suche nach Kultur Methode in der Lagos Klasse selbst. Wenn es es findet, ruft es die Methode auf. Wenn nicht, wird mit Schritt zwei fortgefahren.
  2. Wenn es das nicht findet Kultur Methode in der Lagos Klasse betrachtet Python die Basisklassen in der Reihenfolge, in der sie in der Klassendefinition erscheinen. In diesem Fall, Lagos erbt zuerst von Afrika und dann von Nigeria. Also wird Python nach dem suchen Kultur Methode in Afrika Erste.
  3. Wenn es das nicht findet Kultur Methode in der Afrika Klasse wird Python dann in der suchen Nigeria Klasse. Dieses Verhalten setzt sich fort, bis das Ende der Hierarchie erreicht ist, und löst einen Fehler aus, wenn die Methode in keiner der Oberklassen gefunden werden kann.

Die Ausgabe zeigt die Methodenauflösungsreihenfolge von Lagos, beginnend von links nach rechts.

Häufige Fallstricke und Best Practices

Bei der Arbeit mit super(), gibt es einige häufige Fallstricke, die es zu vermeiden gilt.

  1. Beachten Sie die Methodenauflösungsreihenfolge, insbesondere in Mehrfachvererbungsszenarien. Wenn Sie komplexe Mehrfachvererbung verwenden müssen, sollten Sie mit der vertraut sein C3-Linearisierungsalgorithmus die Python zur Bestimmung des MRO verwendet.
  2. Vermeiden Sie zirkuläre Abhängigkeiten in Ihrer Klassenhierarchie, die zu unvorhersehbarem Verhalten führen können.
  3. Dokumentieren Sie Ihren Code klar, vor allem bei der Verwendung super() in komplexen Klassenhierarchien, um es für andere Entwickler verständlicher zu machen.

Verwenden Sie super() richtig

Pythons super() Die Funktion ist eine leistungsstarke Funktion, wenn Sie mit Vererbung und Methodenüberschreibung arbeiten. Verstehen wie super() funktioniert und wenn Sie Best Practices befolgen, können Sie wartbareren und effizienteren Code in Ihren Python-Projekten erstellen.