Vererbung und Polymorphie in Python

You are here:

Die Vererbung ist ein grundlegendes Konzept der objektorientierten Programmierung, bei dem eine Klasse (die Unterklasse) Eigenschaften und Methoden von einer anderen Klasse (der Basisklasse oder Superklasse) erbt.

class Fahrzeug:

    def __init__(self, marke, modell):

        self.marke = marke

        self.modell = modell

class Auto(Fahrzeug):

    pass

mein_auto = Auto("Tesla", "Model S")

print(mein_auto.marke)  # Ausgabe: "Tesla"

Überschreiben von Methoden

Manchmal möchten wir das Verhalten einer geerbten Methode in der Unterklasse ändern. Dafür können wir die Methode in der Unterklasse überschreiben.

class Fahrzeug:

    def beschleunigen(self):

        return "Das Fahrzeug beschleunigt."

class Auto(Fahrzeug):

    def beschleunigen(self):

        return "Das Auto beschleunigt schnell."

mein_auto = Auto()

print(mein_auto.beschleunigen())  # Ausgabe: "Das Auto beschleunigt schnell."

Verwenden von `super()`

Um auf die Methoden der Basisklasse zuzugreifen, können wir die Funktion `super()` verwenden. Dies ist besonders nützlich, wenn wir den `__init__`-Konstruktor der Basisklasse aufrufen möchten.

class Fahrzeug:

    def __init__(self, marke, modell):

        self.marke = marke

        self.modell = modell

class Auto(Fahrzeug):

    def __init__(self, marke, modell, sitze):

        super().__init__(marke, modell)

        self.sitze = sitze

mein_auto = Auto("Tesla", "Model S", 5)

print(mein_auto.sitze)  # Ausgabe: 5

Abstrakte Klassen und abstrakte Methoden

Abstrakte Klassen sind Klassen, die nicht instanziiert werden können. Sie dienen als Basis für andere Klassen und enthalten abstrakte Methoden, die in abgeleiteten Klassen implementiert werden müssen. In Python verwenden wir das Modul `abc` (Abstract Base Classes), um abstrakte Klassen und Methoden zu definieren.

from abc import ABC, abstractmethod

class Tier(ABC):

    @abstractmethod

    def spricht(self):

        pass

class Hund(Tier):

    def spricht(self):

        return "Wuff!"

Polymorphie und Interfaces

Polymorphie ermöglicht es, dass verschiedene Klassen dieselbe Schnittstelle implementieren und somit austauschbar verwendet werden können. In Python gibt es keine expliziten Interfaces wie in Java, aber abstrakte Klassen können als Interfaces verwendet werden.

from abc import ABC, abstractmethod

class SprechendesTier(ABC):

    @abstractmethod

    def spricht(self):

        pass

class Hund(SprechendesTier):

    def spricht(self):

        return "Wuff!"

class Katze(SprechendesTier):

    def spricht(self):

        return "Miau!"

def tier_sprache(tier):

    print(tier.spricht())

mein_hund = Hund()

meine_katze = Katze()

tier_sprache(meine_katze)  # Ausgabe: "Miau!"

Mehrfachvererbung

In Python ist es möglich, mehrere Basisklassen für eine Klasse zu haben. Dies wird als Mehrfachvererbung bezeichnet. Die Methodenauflösungsreihenfolge (MRO) bestimmt, welche Methode aufgerufen wird, wenn mehrere Basisklassen dieselbe Methode haben.

class A:

    def methode(self):

        return "Klasse A"

class B:

    def methode(self):

        return "Klasse B"

class C(A, B):

    pass

c = C()

print(c.methode())  # Ausgabe: "Klasse A"

Mixins

Mixins sind kleine Klassen, die spezifische Funktionalitäten anbieten und in größere Klassen einfließen können. Sie sind ein weiteres Beispiel für Mehrfachvererbung.

class SprecherMixin:

    def spricht(self):

        return "Das Objekt spricht."

class Hund(SprecherMixin):

    pass

class Katze(SprecherMixin):

    pass

mein_hund = Hund()

meine_katze = Katze()

print(mein_hund.spricht())  # Ausgabe: "Das Objekt spricht."

print(meine_katze.spricht())  # Ausgabe: "Das Objekt spricht."

Durch das Verständnis von Vererbung, Polymorphie, abstrakten Klassen und Mehrfachvererbung kannst Du Deine Python-Programme modularer und wiederverwendbar gestalten. Du hast jetzt ein solides Verständnis der objektorientierten Programmierung in Python und kannst diese Konzepte in Deinen eigenen Projekten anwenden.