Direkt zum Inhalt

Abstrakte Python-Klassen: Ein umfassender Leitfaden mit Beispielen

Erfahre mehr über abstrakte Klassen in Python, ihren Zweck und wie du das Modul `abc` verwendest, um konsistente Schnittstellen zu erzwingen. Enthält praktische Beispiele und Best Practices für eine effektive Umsetzung.
Aktualisierte 22. Jan. 2025  · 10 Min. Lesezeit

Eine Schlüsselkomponente der modernen Softwareentwicklung ist die objektorientierte Programmierung (OOP), die Programmierern die Möglichkeit gibt, ihren Code skalierbar, modular und wiederverwendbar zu gestalten. Abstrakte Klassen sind eines der zahlreichen OOP-Konzepte, die wichtig sind, um eine Vorlage zu erstellen, die andere Klassen verwenden können. Dieser Beitrag erklärt abstrakte Klassen, ihre Vorteile und wie du sie mit dem abc-Modul von Python erfolgreich erstellen kannst.

Neu in Python? Lerne, wie du mit Modulen und Paketen arbeitest, mit eingebauten Datentypen arbeitest und eigene Funktionen schreibst.

Was ist eine abstrakte Klasse?

Andere Klassen verwenden eine abstrakte Klasse als Modell. Obwohl sie deren Implementierung nicht bereitstellt, legt sie Methoden fest, die ihre Unterklassen verwenden müssen. So können Programmierer garantieren, dass alle Unterklassen einem bestimmten Vertrag folgen, indem sie eine einheitliche Schnittstelle für verschiedene Implementierungen erzwingen.

Zum Beispiel könnte eine abstrakte Klasse wie Shape Methoden wie area und perimeter definieren. Die Implementierung dieser Funktionen würde dann für jede einzelne Form, wie z. B. einen Kreis oder ein Rechteck, bereitgestellt werden.

Willst du deine OOP-Kenntnisse auf die nächste Stufe bringen? Melde dich für unseren Kurs Objektorientierte Programmierung in Pythonan. 

Warum sollte man abstrakte Klassen in Python verwenden?

Abstrakte Klassen sind nützlich, wenn du:

  • Erzwinge die Umsetzung der Methode: Die Methoden einer abstrakten Klasse funktionieren wie ein Vertrag, der von jeder Unterklasse verlangt, ihre eigene Implementierung zu liefern. Dadurch wird die Möglichkeit inkonsistenter oder fehlender Implementierungen verringert, da sichergestellt wird, dass bestimmte Funktionen in allen abgeleiteten Klassen vorhanden sind.
  • Fördern Sie die Wiederverwendung von Code: Abstrakte Klassen können sowohl konkrete als auch abstrakte Methoden haben. Die konkreten Methoden reduzieren Code-Duplizierung und fördern die DRY-Prinzipien (Do not Repeat Yourself), indem sie gemeinsame Funktionen bereitstellen, die von allen Unterklassen geerbt werden können.
  • Verbessere die Lesbarkeit und Wartungsfreundlichkeit: Abstrakte Klassen helfen Entwicklern, die Struktur und Funktionalität der Software besser zu verstehen, indem sie einen konsistenten und transparenten Rahmen bieten. Diese Struktur erleichtert die Wartung des Codes, indem sie Entwurfsprinzipien wie Einzelverantwortung und Trennung der Zuständigkeiten durchsetzt.
  • Ermutige den Polymorphismus: Abstrakte Klassen machen es möglich, allgemeinen Code zu schreiben, der mit einer Vielzahl von Unterklassen gut funktioniert. Dank dieser Flexibilität können Entwickler Funktionen oder Methoden erstellen, die jede Unterklasse der abstrakten Klasse behandeln können, was die Erweiterbarkeit des Codes und die Anpassungsfähigkeit an zukünftige Änderungen erhöht.

Du kannst sicherstellen, dass jede Unterklasse, wie z.B. Dog oder Cat, ihre Implementierung der Methode speak implementiert, zum Beispiel, wenn du eine abstrakte Klasse Animal mit einer abstrakten Methode speak hast. Durch diese Einheitlichkeit wird dein Code zuverlässig und vorhersehbar.

Werde ein professioneller Python-Entwickler, indem du noch heute unseren Python-Entwickler-Kurs belegst. 

Das abc-Modul in Python

Das Modul abc in Python bietet eine starke integrierte Unterstützung für abstrakte Klassen. Das Modul, das für "Abstract Base Classes" (Abstrakte Basisklassen) steht, gibt Programmierern die nötigen Werkzeuge an die Hand, um abstrakte Klassen zu erstellen, darunter den abstractmethod Dekorator und die ABC-Klasse. 

Indem du abstrakte Methoden definierst und ihre Implementierung in Unterklassen vorschreibst, helfen dir diese Werkzeuge, die Einheitlichkeit und Konformität mit einer vorgegebenen Schnittstelle zu wahren. Indem es die Implementierung wesentlicher Methoden in allen abgeleiteten Klassen vorschreibt und die teilweise Implementierung gemeinsamer Funktionen in abstrakten Basisklassen zulässt, fördert das Modul auch verbesserte Entwurfsmuster. 

Aus diesem Grund ist das ABC-Modul eine wichtige Komponente für die Organisation skalierbarer, robuster und stabiler Python-Anwendungen.

Erstellen einer abstrakten Python-Klasse

Im ABC-Modul werden zwei wesentliche Komponenten eingeführt:

Abstrakte Basisklasse, oder ABC

Die ABC-Klasse ist eine eingebaute Python-Funktion, die als grundlegende Basis für die Entwicklung abstrakter Klassen dient. Du musst von ABC erben, um eine abstrakte Klasse zu definieren. Die Klasse ist abstrakt und kann nicht direkt instanziiert werden, was durch diese Vererbung angezeigt wird. Indem sie als Blaupausen fungieren, sorgen abstrakte Klassen dafür, dass sich jede konkrete Unterklasse an eine Reihe von Regeln hält.

Du kannst abstrakte Methoden innerhalb einer abstrakten Klasse definieren, indem du den abstractmethod Dekorator verwendest. Jede konkrete Unterklasse muss abstrakte Methoden, die Platzhalter sind, implementieren und außer Kraft setzen. Das macht den Code konsistent und vorhersehbar, indem es garantiert, dass alle abgeleiteten Klassen die Funktionalität für die vorgesehenen Methoden bieten. Ein nützliches Werkzeug, um die Implementierung von Methoden zu fordern und gleichzeitig den Unterklassen Flexibilität zu geben, wie sie diese Anforderungen erfüllen können, ist der abstractmethod Dekorator.

Hier ist ein einfaches Beispiel:

from abc import ABC, abstractmethod

class Shape(ABC):
    @abstractmethod
    def area(self):
        pass

    @abstractmethod
    def perimeter(self):
        pass

class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius

    def area(self):
        return 3.14159 * self.radius ** 2

    def perimeter(self):
        return 2 * 3.14159 * self.radius

# Uncommenting the following line will raise an error because we’re missing method implementations
# shape = Shape() # TypeError: Can't instantiate abstract class Shape with abstract methods #area, perimeter

circle = Circle(5)
print(f"Area: {circle.area()}")
print(f"Perimeter: {circle.perimeter()}")
Area: 78.53975
Perimeter: 31.4159

Wenn du auf der Suche nach weiteren praktischen Python-Projekten bist, schau dir unsere Liste der 60 besten Python-Projekte für Entwickler auf allen Ebenen an. 

Wie das abc-Modul die Methodenimplementierung erzwingt

Jede Unterklasse einer abstrakten Klasse implementiert dank des abstractmethod Dekorators garantiert die dekorierten Methoden. Als Vorsichtsmaßnahme wird verhindert, dass Unterklassen erstellt werden, die nicht über die notwendigen Fähigkeiten verfügen. 

Python meldet TypeError, wenn versucht wird, eine Unterklasse zu instanziieren, die nicht alle abstrakten Methoden außer Kraft gesetzt hat. Diese strenge Durchsetzung senkt die Wahrscheinlichkeit von Fehlern und verbessert die Stabilität des Codes, indem sie den Entwicklern hilft, Implementierungsfehler frühzeitig zu erkennen. 

Sie garantiert auch, dass alle konkreten Unterklassen dem beabsichtigten Verhalten und Design der abstrakten Klasse folgen.

Zum Beispiel:

class Rectangle(Shape):
    def __init__(self, width, height):
        self.width = width
        self.height = height

    # Missing area and perimeter implementation

# This will raise an error
rectangle = Rectangle(5, 10)
TypeError: Can't instantiate abstract class Rectangle with abstract methods area, perimeter

Abstrakte Klassenmethoden in Python

In Python bedeutet die Definition einer abstrakten Klasse die Verwendung des abstractmethod Dekorators und die Unterklassenbildung von ABC. Auf diese Weise können Programmierer den Grundstein für andere Klassen legen, indem sie die Methoden definieren, die verwendet werden müssen. 

Hier findest du eine gründliche Schritt-für-Schritt-Anleitung:

  • Bringe die notwendigen Module mit: Du solltest zuerst ABC und abstractmethod aus dem ModulABC importieren. Um abstrakte Klassen und Methoden zu definieren, sind diese Werkzeuge notwendig.
  • Konstruiere eine Klasse, die auf ABC basiert: Erstelle eine neue Klasse und lege ABC als ihren Erben fest. Die Klasse ist abstrakt und kann nicht direkt instanziiert werden, was durch diese Vererbung angezeigt wird.
  • Definiere abstrakte Methoden mit @abstractmethod: Um festzulegen, welche Methoden von Unterklassen überschrieben werden müssen, verwendest du den @abstractmethod Dekorator. Im Wesentlichen dienen diese Methoden als Platzhalter, die sicherstellen, dass alle abgeleiteten Klassen die notwendigen Operationen ausführen.

Schritt-für-Schritt-Beispiel für die Definition einer abstrakten Klasse

Hier ist ein praktisches Beispiel zur Veranschaulichung:

from abc import ABC, abstractmethod

class Vehicle(ABC):
    @abstractmethod
    def start_engine(self):
        pass

    @abstractmethod
    def stop_engine(self):
        pass

class Car(Vehicle):
    def start_engine(self):
        print("Car engine started")

    def stop_engine(self):
        print("Car engine stopped")

# Instantiating the abstract class directly will raise an error
# vehicle = Vehicle()

car = Car()
car.start_engine()
car.stop_engine()

Car engine started
Car engine stopped

Dies garantiert, dass die Funktionen start_engine und stop_engine von jeder Unterklasse von Vehicle implementiert werden.

Praxisbeispiel: Implementierung einer abstrakten Klasse

Sieh dir eine ausführlichere Illustration mit einer Vehicle Klasse an:

from abc import ABC, abstractmethod

class Vehicle(ABC):
    def __init__(self, brand):
        self.brand = brand

    @abstractmethod
    def start_engine(self):
        pass

    @abstractmethod
    def stop_engine(self):
        pass

class Motorcycle(Vehicle):
    def start_engine(self):
        print(f"{self.brand} motorcycle engine started")

    def stop_engine(self):
        print(f"{self.brand} motorcycle engine stopped")

motorcycle = Motorcycle("Yamaha")
motorcycle.start_engine()
motorcycle.stop_engine()
Yamaha motorcycle engine started
Yamaha motorcycle engine stopped

Dies verdeutlicht, wie abstrakte Klassen Flexibilität bei der Implementierung ermöglichen und gleichzeitig eine einheitliche Schnittstelle durchsetzen.

Beispiel für eine abstrakte Python-Basisklasse

Nachdem wir nun gesehen haben, wie abstrakte Basisklassen einen Vertrag für Unterklassen definieren, wollen wir untersuchen, wie konkrete Klassen diese Anforderungen erfüllen, indem sie alle abstrakten Methoden implementieren.

Konkrete Klasse, die von einer abstrakten Klasse erbt

Eine Unterklasse, die alle abstrakten Methoden einer abstrakten Klasse implementiert, wird als konkrete Klasse bezeichnet. Das bedeutet, dass die konkrete Klasse spezifische Implementierungen für alle notwendigen Methoden bereitstellt und damit den von der abstrakten Klasse festgelegten Vertrag erfüllt. 

Zum Beispiel:

from abc import ABC, abstractmethod

class Appliance(ABC):
    @abstractmethod
    def turn_on(self):
        pass

    @abstractmethod
    def turn_off(self):
        pass

class WashingMachine(Appliance):
    def turn_on(self):
        print("Washing machine is now ON")

    def turn_off(self):
        print("Washing machine is now OFF")

machine = WashingMachine()
machine.turn_on()
machine.turn_off()

Washing machine is now ON
Washing machine is now OFF

Instanzen erstellen und Regeln durchsetzen

Python verhindert, dass du eine abstrakte Klasse sofort instanziieren kannst. Dies ist ein wesentlicher Aspekt abstrakter Klassen, denn es stellt sicher, dass jede Unterklasse, die aus der abstrakten Klasse erzeugt wird, sich an den notwendigen Vertrag hält, der durch die abstrakten Methoden vorgegeben ist. 

Zum Beispiel wird eine TypeError ausgelöst, wenn du versuchst, eine appliance = Appliance()

Diese Einschränkung garantiert, dass abstrakte Klassen nur als Blaupausen funktionieren und nicht missbraucht werden können. Python ermöglicht es, Instanzen von WashingMachine zu erstellen und dabei den in Appliance festgelegten Vertrag einzuhalten, indem alle abstrakten Methoden in WashingMachine implementiert werden. Dadurch, dass garantiert wird, dass jedes in der abstrakten Klasse angegebene Merkmal vollständig in den konkreten Unterklassen implementiert ist, wird die Integrität der Codebasis verbessert.

Abstrakte Eigenschaften und Initialisierung

Auf dieser Grundlage wollen wir uns genauer ansehen, wie Python abstrakte Eigenschaften mit den @property’ and @abstractmethod'-Dekoratoren unterstützt und es Entwicklern ermöglicht, die Konsistenz von Attributen und Methoden zu erzwingen.

Abstrakte Eigenschaften in Python verwenden

Abstrakte Klassen können neben den Methoden auch Eigenschaften angeben, die Unterklassen implementieren müssen. Diese Funktion ermöglicht es Entwicklern, eine einheitliche Schnittstelle für Eigenschaften festzulegen, die Unterklassen zusätzlich zu den Methoden deklarieren müssen. 

Um zu gewährleisten, dass jede Unterklasse ihre Implementierung bereitstellt, können abstrakte Eigenschaften mit dem @property Dekorator in Kombination mit @abstractmethod angegeben werden. Bei der Erstellung von Klassen, die schreibgeschützte oder berechnete Attribute benötigen, die für den Betrieb der Klasse wichtig sind, ist diese Methode besonders hilfreich.

Beispiel: abstrakte Klasse mit Eigenschaften

Hier ist ein Beispiel:

from abc import ABC, abstractmethod

class Animal(ABC):
    @property
    @abstractmethod
    def sound(self):
        pass

class Bird(Animal):
    @property
    def sound(self):
        return "Chirp"

bird = Bird()
print(bird.sound)

Chirp

Die Bedingung der abstrakten Klasse Animal wird durch das Merkmal sound der Klasse Bird erfüllt.

Wann man abstrakte Python-Klassen verwenden sollte

Abstrakte Klassen sind ideal für Szenarien wie:

  • Bei der Entwicklung von Frameworks oder Bibliotheken, bei denen ein bestimmtes Verhalten erzwungen werden muss: In komplizierten Systemen können abstrakte Klassen eine einheitliche Reihe von Richtlinien oder Schnittstellen festlegen, an die sich alle Unterklassen halten müssen, um Konsistenz zu gewährleisten und Fehler zu vermeiden.
  • Implementierung einheitlicher APIs für alle Klassen: Entwickler können durch die Definition abstrakter Methoden sicherstellen, dass alle abgeleiteten Klassen ein standardisiertes und vorhersehbares Mittel zur Kommunikation mit der Anwendung oder Bibliothek bieten.
  • Bereitstellung eines Grundgerüsts für eine Klassenhierarchie: Eine Hierarchie verwandter Klassen kann mit Hilfe von abstrakten Klassen als Leitfaden erstellt werden. Indem sie Anpassungen in Unterklassen zulässt und Entwicklern erlaubt, gemeinsame Verhaltensweisen und Merkmale in der abstrakten Klasse zu deklarieren, fördert diese Struktur die Wiederverwendbarkeit und minimiert Doppelarbeit.

Bewährte Praktiken

Wenn ein genauer Vertrag für Unterklassen festgelegt werden muss, solltest du abstrakte Klassen verwenden. Abstrakte Klassen sind nützlich, wenn du eine bestimmte Struktur oder ein bestimmtes Verhalten auf mehrere abgeleitete Klassen anwenden willst. Sie helfen sicherzustellen, dass jede Unterklasse einem Standarddesign folgt, was die Vorhersehbarkeit des Codes verbessert und die Wartung erleichtert.

Wenn jede Methode eine Standardimplementierung haben kann, solltest du keine abstrakten Klassen verwenden. In bestimmten Situationen kann eine konkrete Basisklasse die bessere Option sein, um die Komplexität zu verringern und gleichzeitig die Möglichkeit der Wiederverwendung gemeinsamer Funktionen zu erhalten.

Achte darauf, dass abstrakte Klassen klar und einfach sind und nur die wichtigsten Attribute und Methoden definieren. Es kann eine Herausforderung sein, eine abstrakte Klasse zu erstellen und zu pflegen, wenn sie zu viele Kriterien hat. Konzentriere dich stattdessen auf die wesentlichen Aspekte, die die abgeleiteten Klassen haben müssen.

Fazit

Das OOP-Toolkit von Python enthält abstrakte Klassen, die ein mächtiges Werkzeug sind, mit dem Programmierer zuverlässige und wartbare Programme erstellen können. Du kannst die Übersichtlichkeit, Wiederverwendbarkeit und Erweiterbarkeit deiner Anwendungen fördern, indem du abstrakte Klassen definierst und mit Hilfe des ABC-Moduls eine einheitliche Schnittstelle für alle Unterklassen durchsetzt. Das Schreiben von besserem, zuverlässigerem Code kann durch die Implementierung abstrakter Klassen erreicht werden, unabhängig von der Größe des Systems, an dem du arbeitest.

Ganz gleich, ob du robuste objektorientierte Programme entwirfst, konsistente Schnittstellen durchsetzt oder skalierbare Anwendungen erstellst, die Beherrschung der abstrakten Klassen von Python verbessert deine Fähigkeit, effizienten und wartbaren Code zu schreiben. Verbessere deine Python-Kenntnisse noch heute mit unserem umfassenden Lernpfad Python-Grundlagen.

Python Abstrakte Klasse FAQs

Wie definiert man eine abstrakte Methode in Python?

Eine abstrakte Methode wird mit dem @abstractmethod Dekorator aus dem abc Modul definiert. Sie dient als Platzhalter und muss von jeder Unterklasse überschrieben werden.

Kannst du eine abstrakte Klasse in Python instanziieren?

Nein, du kannst eine abstrakte Klasse nicht direkt instanziieren. Python gibt eine TypeError aus, wenn du versuchst, ein Objekt einer abstrakten Klasse zu erstellen.

Was ist der Zweck des Moduls `abc` in Python?

Das Modul abc bietet die Klasse ABC und den Dekorator abstractmethod, um abstrakte Klassen und Methoden in Python zu definieren und durchzusetzen.

Kann eine abstrakte Klasse reguläre (konkrete) Methoden haben?

Ja, eine abstrakte Klasse kann konkrete Methoden mit Implementierung haben. Diese Methoden können vererbt und von Unterklassen verwendet werden.


Derrick Mwiti's photo
Author
Derrick Mwiti
Themen

Top Python Kurse

Lernpfad

Python Data Fundamentals

28hrs hr
Grow your data skills, discover how to manipulate and visualize data, and apply advanced analytics to make data-driven decisions.
Siehe DetailsRight Arrow
Kurs starten
Mehr anzeigenRight Arrow
Verwandt

Der Blog

Lehrer/innen und Schüler/innen erhalten das Premium DataCamp kostenlos für ihre gesamte akademische Laufbahn

Keine Hacks, keine Tricks. Schüler/innen und Lehrer/innen, lest weiter, um zu erfahren, wie ihr die Datenerziehung, die euch zusteht, kostenlos bekommen könnt.
Nathaniel Taylor-Leach's photo

Nathaniel Taylor-Leach

4 Min.

Der Blog

Die 32 besten AWS-Interview-Fragen und Antworten für 2024

Ein kompletter Leitfaden zur Erkundung der grundlegenden, mittleren und fortgeschrittenen AWS-Interview-Fragen, zusammen mit Fragen, die auf realen Situationen basieren. Es deckt alle Bereiche ab und sorgt so für eine abgerundete Vorbereitungsstrategie.
Zoumana Keita 's photo

Zoumana Keita

30 Min.

Der Blog

2022-2023 DataCamp Classrooms Jahresbericht

Zu Beginn des neuen Schuljahres ist DataCamp Classrooms motivierter denn je, das Lernen mit Daten zu demokratisieren. In den letzten 12 Monaten sind über 7.650 neue Klassenzimmer hinzugekommen.
Nathaniel Taylor-Leach's photo

Nathaniel Taylor-Leach

8 Min.

Der Blog

Top 30 Generative KI Interview Fragen und Antworten für 2024

Dieser Blog bietet eine umfassende Sammlung von Fragen und Antworten zu generativen KI-Interviews, die von grundlegenden Konzepten bis hin zu fortgeschrittenen Themen reichen.
Hesam Sheikh Hassani's photo

Hesam Sheikh Hassani

15 Min.

Der Blog

Q2 2023 DataCamp Donates Digest

DataCamp Donates hat im zweiten Quartal 2023 über 20.000 Stipendien an unsere gemeinnützigen Partner vergeben. Erfahre, wie fleißige benachteiligte Lernende diese Chancen in lebensverändernde berufliche Erfolge verwandelt haben.
Nathaniel Taylor-Leach's photo

Nathaniel Taylor-Leach

Der Blog

Die 20 besten Snowflake-Interview-Fragen für alle Niveaus

Bist du gerade auf der Suche nach einem Job, der Snowflake nutzt? Bereite dich mit diesen 20 besten Snowflake-Interview-Fragen vor, damit du den Job bekommst!
Nisha Arya Ahmed's photo

Nisha Arya Ahmed

20 Min.

Mehr anzeigenMehr anzeigen