CodeGym /Kurse /Python SELF DE /Initialisierung der Hierarchie

Initialisierung der Hierarchie

Python SELF DE
Level 16 , Lektion 1
Verfügbar

7.1 Methode super()

Wenn wir schon die Vererbungshierarchie ansprechen, ist es nützlich, über die Feinheiten der Arbeit mit Feldern und Methoden der Basisklasse zu sprechen. Dafür gibt es in Python eine spezielle Methode super(). Diese Methode wird verwendet, um Methoden der Basisklasse innerhalb einer abgeleiteten Klasse aufzurufen.

Es gibt drei Hauptanwendungsbereiche:

Aufruf von Methoden der Elternklasse:

Die Methode super() ermöglicht es, eine Methode der Elternklasse aus einer abgeleiteten Klasse aufzurufen, ohne explizit den Namen der Elternklasse anzugeben. Das ist besonders nützlich bei der Arbeit mit Mehrfachvererbung und hilft, Fehler bei der Änderung der Klassenhierarchie zu vermeiden.

Initialisierung von Basisklassen:

super() wird häufig im Konstruktor der abgeleiteten Klasse verwendet, um den Konstruktor der Basisklasse aufzurufen, was es ermöglicht, Attribute der Basisklasse in der abgeleiteten Klasse zu initialisieren.

Unterstützung der Mehrfachvererbung:

Im Falle der Mehrfachvererbung löst super() die Reihenfolge der Methodenaufrufe (MRO, Method Resolution Order) korrekt auf, was seine Verwendung bevorzugt macht gegenüber dem expliziten Aufruf von Methoden der Elternklassen. Darüber sprechen wir ein wenig später.

7.2 Konstruktor der Basisklasse

Der Konstruktor der Basisklasse muss explizit aufgerufen werden. Es scheint, als ob dies automatisch geschieht, aber das ist nicht der Fall. Konstruktoren der Basisklassen müssen immer explizit aufgerufen werden, da sehr oft spezielle Argumente übergeben werden müssen.

Beispiel:


class Animal:
    def __init__(self, type, name):
        self.type = type
        self.name = name
         
        
class Dog(Animal):
    def __init__(self, name):
        super().__init__("Hund", name)  # Aufruf des Konstruktors der Basisklasse
        
class Cat(Animal):
    def __init__(self, name):
        super().__init__("Katze", name)  # Aufruf des Konstruktors der Basisklasse
        
        
# Erstellen eines Dog Objekts
dog = Dog("Buddy")
print(dog) 

In diesem Beispiel hat der Konstruktor der Basisklasse (Animal) zwei Parameter: den Tier Typ und seinen Namen. Die Nachfolgerklassen haben nur einen — nur den Namen.

Genau in den Konstruktoren der Klassen Dog und Cat wird entschieden, was genau an den Konstruktor der Basisklasse übergeben wird — die Namen der Tierarten „Hund“ und „Katze“.

Also:

  • Der Konstruktor der Basisklasse muss unbedingt im Konstruktor der abgeleiteten Klasse aufgerufen werden.
  • Dafür muss die Methode super() verwendet werden.
  • Der Parameter self muss nicht extra übergeben werden — Python fügt ihn beim Methodenaufruf automatisch hinzu.

7.3 Verwendung der Methode super()

Die Methode super() in Python kann nicht nur in Konstruktoren verwendet werden, sondern auch in anderen Methoden von Klassen, um Methoden der Elternklasse aufzurufen. Das kann nützlich sein, wenn es notwendig ist, das Verhalten einer Methode, die in der Elternklasse definiert ist, zu erweitern oder zu modifizieren.

Schauen wir uns einige Beispiele an:

Aufruf einer Methode der Elternklasse in einer abgeleiteten Methode

In diesem Beispiel ruft die Methode speak() in der Klasse Dog zunächst die Methode speak() aus der Klasse Animal mit Hilfe von super() auf und fügt dann ihr eigenes Verhalten hinzu.


class Animal:
    def speak(self):
        return "Ein generisches Tiergeräusch"
        

class Dog(Animal):
    def speak(self):
        parent_speech = super().speak()  # Aufruf der Methode der Elternklasse
        return f"{parent_speech} Und der Hund bellt!"
        
dog = Dog()
print(dog.speak())  # Ausgabe: Ein generisches Tiergeräusch Und der Hund bellt!

Aufruf einer Methode der Elternklasse zur Zustandsüberprüfung

In diesem Beispiel ruft die Methode check_health() in der Klasse Dog die Methode check_health() aus der Klasse Animal auf, um zusätzlichen Überprüfungen hinzuzufügen.


class Animal:
    def check_health(self):
        return "Tier ist gesund"
        

class Dog(Animal):
    def check_health(self):
        parent_check = super().check_health()  # Aufruf der Methode der Elternklasse
        return f"{parent_check}. Der Hund braucht einen Spaziergang!"
        
dog = Dog()
print(dog.check_health())  # Ausgabe: Tier ist gesund. Der Hund braucht einen Spaziergang!

Aufruf einer Methode der Elternklasse in einer Methode, die den Zustand ändert

In diesem Beispiel überprüft die Methode withdraw() in der Klasse SavingsAccount zunächst, ob das Abhebelimit überschritten wurde, und wenn nicht, ruft sie die Methode withdraw() aus der Klasse BankAccount auf, um die Operation auszuführen.


class BankAccount:
    def __init__(self, balance):
        self.balance = balance
        

    def withdraw(self, amount):
        if self.balance >= amount:
            self.balance -= amount
            return f"Abgehoben {amount}. Neuer Kontostand: {self.balance}"
        return "Nicht genügend Geldmittel"
        

class SavingsAccount(BankAccount):
    def withdraw(self, amount):
        if amount > 1000:
            return "Abhebelimit überschritten"
        return super().withdraw(amount)  # Aufruf der Methode der Elternklasse
        

savings = SavingsAccount(1500)
print(savings.withdraw(500))  # Ausgabe: Abgehoben 500. Neuer Kontostand: 1000
print(savings.withdraw(1500))  # Ausgabe: Abhebelimit überschritten
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION