目次
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.")
In diesem Beispiel überschreibt 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.")
In diesem Beispiel erbt die Klasse 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!")
In diesem Beispiel überschreibt die Klasse 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)
Python bestimmt MRO (Method Resolution Order), welche Methode der Elternklasse aufgerufen wird. Um diese Reihenfolge zu überprüfen, verwendet man 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())
In diesem Beispiel erbt die 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
Auf diese Weise ist Komposition die Methode, Funktionen zwischen Klassen zu teilen, ohne Vererbung zu verwenden. Indem man nur die benötigten Funktionen bereitstellt, wird der Code flexibler und leichter zu verwalten.