Python - Vererbung

Was ist Vererbung in Python?

Vererbung ist ein grundlegendes Konzept in der objektorientierten Programmierung (OOP), das es einer Klasse ermöglicht, die Eigenschaften und Methoden einer anderen Klasse zu erben. Dies ermöglicht die Wiederverwendbarkeit und Modularität des Codes, da Sie neue Klassen auf Basis bestehender Klassen erstellen können, ohne den selben Code erneut schreiben zu müssen. In Python wird die Vererbung durch die Verwendung des class-Schlüsselworts gefolgt vom Namen der Elternklasse in Klammern implementiert.

Python - Inheritance

Erstellen einer Elternklasse

Beginnen wir mit dem Erstellen einer einfachen Elternklasse namens Animal:

class Animal:
def __init__(self, name):
self.name = name

def speak(self):
raise NotImplementedError("Subklasse muss diese Methode implementieren")

In diesem Beispiel definieren wir eine Animal-Klasse mit einer __init__-Methode, die das name-Attribut initialisiert, und einer speak-Methode, die einen NotImplementedError auslöst. Dieser Fehler wird ausgelöst, wenn die Subklasse keine eigene Implementierung der speak-Methode bereitstellt.

Erstellen einer Kindklasse

Jetzt erstellen wir eine Kindklasse namens Dog, die von der Animal-Klasse erbt:

class Dog(Animal):
def speak(self):
return f"{self.name} sagt Wuff!"

Die Dog-Klasse erbt alle Attribute und Methoden der Animal-Klasse, bietet aber ihre eigene Implementierung der speak-Methode an. Wenn wir eine Instanz der Dog-Klasse erstellen und deren speak-Methode aufrufen, wird sie [Name des Hundes] sagt Wuff! zurückgeben, anstatt einen Fehler auszulösen.

mein_hund = Dog("Buddy")
print(mein_hund.speak())  # Ausgabe: Buddy sagt Wuff!

Arten der Vererbung

Es gibt drei Arten der Vererbung in Python: einfache Vererbung, multiple Vererbung, mehrstufige Vererbung und hierarchische Vererbung. Wir werden jede Art im Detail untersuchen.

Python - Einfache Vererbung

Die einfache Vererbung ist die häufigste Form der Vererbung, bei der eine Klasse von nur einer Elternklasse erbt. Wie wir oben gesehen haben, erbt die Dog-Klasse von der Animal-Klasse, was ein Beispiel für einfache Vererbung ist.

Python - Multiple Vererbung

Multiple Vererbung ist das Erben einer Klasse von mehreren Elternklassen. Python unterstützt jedoch keine multiple Vererbung direkt durch die Syntax der Klassendefinition. Stattdessen verwendet es eine Technik namens "Mixins" oder "Schnittstellen", um multiple Vererbung zu erreichen.

Methodeauflösungsreihenfolge (MRO)

Python verwendet den C3-Linearisierungsalgorithmus, um die Reihenfolge zu bestimmen, in der Basisklassen gesucht werden, wenn nach einer Methode gesucht wird. Die MRO stellt sicher, dass jede Klasse höchstens einmal in der Methodeauflösungsreihenfolge appears und erhält die Reihenfolge der Basisklassen so, wie sie in der Klassendefinition angegeben wurden.

Python - Mehrstufige Vererbung

Mehrstufige Vererbung tritt ein, wenn eine Klasse von einer Subklasse erbt und eine Hierarchie von Klassen bildet. Hier ist ein Beispiel:

class Mammal(Animal):
pass

class Cat(Mammal):
def speak(self):
return f"{self.name} sagt Miau!"

In diesem Fall erbt die Cat-Klasse von der Mammal-Klasse, die ihrerseits von der Animal-Klasse erbt. Dies bildet eine mehrstufige Vererbungshierarchie.

Python - Hierarchische Vererbung

Hierarchische Vererbung beinhaltet mehrere Subklassen, die von einer einzigen Superklasse erben. Zum Beispiel:

class Reptile(Animal):
pass

class Snake(Reptile):
def speak(self):
return f"{self.name} sagt Zischen!"

class Lizard(Reptile):
def speak(self):
return f"{self.name} sagt Kriechen!"

In diesem Fall erben sowohl die Snake- als auch die Lizard-Klassen von der Reptile-Klasse, die ihrerseits von der Animal-Klasse erbt. Dies bildet eine hierarchische Vererbungsstruktur.

Python - Hybride Vererbung

Hybride Vererbung kombiniert Merkmale der multiple Vererbung und anderer Arten der Vererbung. Es wird nicht direkt von Python unterstützt, kann jedoch durch die Verwendung von Mixins oder durch die Kombination verschiedener Vererbungsarten erreicht werden.

Die super() Funktion

Die super()-Funktion wird verwendet, um Methoden aus der Elternklasse innerhalb der Subklasse aufzurufen. Sie ist besonders nützlich, wenn Sie eine Methode aus der Elternklasse erweitern oder überschreiben möchten, während Sie noch einige ihrer Funktionalität beibehalten möchten. Hier ist ein Beispiel:

class Bird(Animal):
def __init__(self, name, spannweite):
super().__init__(name)
self.spannweite = spannweite

def speak(self):
return f"{self.name} sagt Zwitschern!"

In diesem Fall erbt die Bird-Klasse von der Animal-Klasse und verwendet die super()-Funktion, um die __init__-Methode der Elternklasse aufzurufen. Dies stellt sicher, dass das name-Attribut richtig initialisiert wird. Zusätzlich bietet die Bird-Klasse ihre eigene Implementierung der speak-Methode an.

mein_vogel = Bird("Tweety", 10)
print(mein_vogel.speak())  # Ausgabe: Tweety sagt Zwitschern!

Durch die Verwendung der Vererbung können Sie mehr spezialisierte Klassen erstellen, die die Funktionalität ihrer Elternklassen erben und erweitern, wodurch die Wiederverwendbarkeit und Organisation des Codes gefördert wird. Bedenken Sie, dass Vererbung nur ein Aspekt der OOP ist, und es gibt andere Konzepte wie Polymorphismus, Encapsulation und Abstraktion, die ebenfalls eine entscheidende Rolle bei der Gestaltung robust und wartbarer Softwaresysteme spielen.

Credits: Image by storyset