目次  
1. Überblick über die Python-Vererbung
In Python ist Vererbung ein Mechanismus, bei dem die Kindklasse Funktionen und Attribute von der Elternklasse übernimmt. Dadurch wird die Wiederverwendbarkeit von Code verbessert und die Wartungseffizienz gesteigert. Es ist eines der wichtigen Konzepte derierung (OOP) und besonders nützlich bei der Entwicklung großer Systeme und langfristigen Projekten.Grundlegende Rollen der Vererbung
- Wiederverwendbarkeit von Code: Da die Funktionen einer einmal geschriebenen Klasse auch in anderen Klassen genutzt werden können, lässt sich doppelter Code vermeiden.
- Einfachere Wartung: Da Änderungen an der Elternklasse automatisch in die Kindklasse übernommen werden, können Korrekturen und Funktions-Erweiterungen effizient durchgeführt werden.
class ParentClass:
    def greet(self):
        print("Hallo, das ist die Elternklasse.")
class ChildClass(ParentClass):
    def greet(self):
        print("Hallo, das ist die Kindklasse.")ChildClass die Methode von ParentClass. Da die greet-Methode überschrieben wird, zeigt die Kindklasse ihre eigene Begrüßung an.2. Einfachvererbung in Python
Einfachvererbung ist ein Modell, bei dem eine Kindklasse die Funktionalität von einer Elternklasse erbt. Dies ist die grundlegende Form der Vererbung in Python und ermöglicht es, die Einfachheit des Codes zu bewahren und gleichzeitig Erweiterbarkeit zu bieten.Grundsyntax und Beispiel für Einfachvererbung
class Car:
    def __init__(self, brand, color):
        self.brand = brand
        self.color = color
    def describe(self):
        print(f"Dieses Auto ist ein {self.color}es {self.brand}.")
class ElectricCar(Car):
    def __init__(self, brand, color, battery_size):
        super().__init__(brand, color)
        self.battery_size = battery_size
    def describe_battery(self):
        print(f"Die Batteriekapazität beträgt {self.battery_size} kWh.")ElectricCar die Funktionalität der Klasse Car und fügt zusätzlich eine Beschreibung der Batteriekapazität hinzu. Mit super() wird der Konstruktor der Elternklasse aufgerufen, um die gemeinsamen Attribute (Marke und Farbe) zu initialisieren.3. Methodenüberschreibung
Überschreiben ist eine Funktion, bei der die Unterklasse die Methode der Oberklasse neu definiert. Dadurch kann man die Methode der Oberklasse nutzen und gleichzeitig das Verhalten in der Unterklasse ändern.Beispiel für Überschreiben
class Animal:
    def speak(self):
        print("Tiergeräusch")
class Dog(Animal):
    def speak(self):
        print("Wuff!")Dog die Methode speak der Klasse Animal. Dadurch gibt eine Instanz der Klasse Dog „Wuff!“ aus, während eine Instanz der Klasse Animal „Tiergeräusch“ anzeigt.4. Mehrfachvererbung
Mehrfachvererbung ermöglicht es einer Kindklasse, von mehreren Elternklassen zu erben. Dadurch können Funktionen verschiedener Klassen in einer Klasse zusammengeführt werden, aber es ist Vorsicht geboten, da die Implementierung komplex werden kann.Beispiele und Vorsichtsmaßnahmen zur Mehrfachvererbung
class A:
    def greet(self):
        print("Gruß von A")
class B:
    def greet(self):
        print("Gruß von B")
class C(A, B):
    pass
c = C()
c.greet()  # Es wird " von A" angezeigt (nach MRO wird die erste Klasse bevorzugt)C.mro(). Mehrfachvererbung ist mächtig, aber man muss Konflikte zwischen Elternklassen und die Reihenfolge der Methoden im Auge behalten.
5. Praktische Beispiele mit Vererbung
Vererbung ist in der alltäglichen Programmierung häufig nützlich. Zum Beispiel kann in einem Unternehmensmitarbeiterverwaltungssystem durch das Erben einer Klasse mit einer bestimmten Position von einer grundlegenden Mitarbeitendenklasse der Code wiederverwendet und erweitert werden.Praktisches Beispiel für ein Mitarbeitendenverwaltungssystem
class Employee:
    def __init__(self, first, last, pay):
        self.first = first
        self.last = last
        self.pay = pay
    def fullname(self):
        return f'{self.first} {self.last}'
class Manager(Employee):
    def __init__(self, first, last, pay, employees=None):
        super().__init__(first, last, pay)
        self.employees = employees if employees is not None else []
    def add_employee(self, employee):
        if employee not in self.employees:
            self.employees.append(employee)
    def print_employees(self):
        for emp in self.employees:
            print(emp.fullname())Manager-Klasse von der Employee-Klasse und fügt Funktionen zur Verwaltung von Mitarbeitenden hinzu. Dabei wird die gemeinsame Funktionalität der Basisklasse beibehalten und Funktionen entsprechend der jeweiligen Position erweitert.6. Best Practices der Vererbung im Vergleich zur Komposition
Vererbung ist sehr mächtig, aber bei übermäßigem Einsatz besteht das Risiko, dass der Code komplex wird. Besonders Mehrfachvererbung kann die Beziehungen zwischen Klassen verkomplizieren, daher sollte sie mit Vorsicht eingesetzt werden. In Fällen wird empfohlen, anstelle von Vererbung Komposition zu verwenden.Beispiel für Komposition
Komposition ist ein Entwurfsmuster, bei dem eine Klasse eine andere Klasse als Komponente (Instanz) besitzt, um Funktionen zu delegieren.class Engine:
    def start(self):
        print("Der Motor wurde gestartet.")
class Car:
    def __init__(self, engine):
        self.engine = engine
    def start(self):
        self.engine.start()
engine = Engine()
car = Car(engine)
car.start()  # "Der Motor wurde gestartet." wird angezeigt
 
 



