Lernpfad
Ein wichtiger Teil der modernen Softwareentwicklung ist die objektorientierte Programmierung (OOP), die es Programmierern ermöglicht, Code auf eine skalierbare, modulare und wiederverwendbare Weise zu organisieren. Abstrakte Klassen sind eins der vielen OOP-Konzepte, die man braucht, um eine Vorlage zu erstellen, die andere Klassen nutzen können. In diesem Beitrag geht's um abstrakte Klassen, ihre Vorteile und wie man sie mit dem abc-Modul von Python erfolgreich erstellt.
Wenn du Python noch nicht kennst, kannst du mit unserem Lernpfad lernen, wie man mit Modulen und Paketen arbeitet, mit integrierten Datentypen arbeitet und benutzerdefinierte Funktionen schreibt.
Was ist eine abstrakte Klasse?
Eine abstrakte Klasse ist wie eine Vorlage für andere Klassen. Es legt Methoden fest, die in jeder Klasse enthalten sein müssen, die davon erbt, aber es gibt nicht den eigentlichen Code für diese Methoden.
Stell dir das wie ein Rezept ohne bestimmte Zutatenvor – essagt dir, welche Schritte du machen musst, aber die Details hängen von der Unterklasse ab.
Beispiel:
Angenommen, du entwickelst ein Programm, um die Fläche verschiedener Formen zu berechnen.
- Du machst eine abstrakte Klasse namens
Shape, die besagt, dass jede Form eine Methodearea()haben muss. - Aber
Shapesagt nicht, wiearea()funktioniert – weil die Formel vom Typ der Form abhängt. - Jede spezifische Form (wie
CircleoderRectangle) kommt vonShapeund hat ihre eigene Version vonarea().
Wenn du mehr über die wichtigsten Python-Konzepte erfahren möchtest, kannst du dich für unseren Kurs „Objektorientierte Programmierung in Python für Fortgeschrittene” anmelden.
Warum sollte man abstrakte Klassen in Python verwenden?
Abstrakte Klassen sind nützlich, wenn du:
- Implementierung der Methode erzwingen: Die Methoden einer abstrakten Klasse sind wie ein Vertrag, der von jeder Unterklasse verlangt, ihre eigene Implementierung zu liefern. Das verringert die Wahrscheinlichkeit von inkonsistenten oder fehlenden Implementierungen, indem 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-Duplikate stark und fördern das DRY-Prinzip (Do not Repeat Yourself), indem sie gemeinsame Funktionen bereitstellen, die von allen Unterklassen übernommen werden können.
- Verbesser die Lesbarkeit und Wartbarkeit: Abstrakte Klassen helfen Entwicklern, die Struktur und Funktionalität der Software besser zu verstehen, indem sie ein einheitliches und transparentes Framework bieten. Diese Struktur macht es einfacher, den Code zu pflegen, indem sie Designprinzipien wie die Prinzipien der einzigen Verantwortung und der Trennung von Verantwortlichkeiten durchsetzt.
- Fördern Sie Polymorphismus: Abstrakte Klassen machen es möglich, allgemeinen Code zu schreiben, der mit vielen Unterklassen gut funktioniert. Dank dieser Flexibilität können Entwickler Funktionen oder Methoden erstellen, die jede Unterklasse der abstrakten Klasse verarbeiten können, was die Erweiterbarkeit und Anpassungsfähigkeit des Codes an zukünftige Änderungen erhöht.
Du kannst sicherstellen, dass jede Unterklasse, wie z. B. Dog oder Cat, ihre Implementierung der Methode speak umsetzt, wenn du zum Beispiel eine abstrakte Klasse Animal mit einer abstrakten Methode speak hast. Durch diese Einheitlichkeit wird dein Code zuverlässig und vorhersehbar.
Python von Grund auf lernen
Das abc-Modul in Python
Das Modul abc in Python hat eine starke eingebaute Unterstützung für abstrakte Klassen. Das Modul, das für „Abstract Base Classes“ steht, gibt Programmierern die Tools, die sie brauchen, um abstrakte Klassen zu erstellen, wie den Dekorator abstractmethod und die ABC-Klasse.
Durch die Definition abstrakter Methoden und die Forderung nach deren Implementierung in Unterklassen helfen dir diese Tools dabei, Einheitlichkeit und Konformität mit einer vorgegebenen Schnittstelle zu gewährleisten. Indem das Modul die Implementierung wichtiger Methoden in allen abgeleiteten Klassen vorschreibt und die teilweise Implementierung gemeinsamer Funktionen in abstrakten Basisklassen erlaubt, fördert es auch bessere Designmuster.
Deswegen ist das ABC-Modul echt wichtig, um skalierbare, robuste und stabile Python-Anwendungen zu organisieren.
Erstellen einer abstrakten Python-Klasse
Im ABC-Modul gibt's zwei wichtige Teile:
Abstrakte Basisklasse oder ABC
Die ABC-Klasse ist eine eingebaute Python-Funktion, die als 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, wie durch diese Vererbung angezeigt wird. Indem sie als Blaupausen dienen, stellen abstrakte Klassen sicher, dass jede konkrete Unterklasse bestimmte Regeln einhält.
Du kannst abstrakte Methoden in einer abstrakten Klasse mit dem Dekorator abstractmethod definieren. Jede konkrete Unterklasse muss abstrakte Methoden, die Platzhalter sind, implementieren und überschreiben. Das macht den Code konsistent und vorhersehbar, weil es sicherstellt, dass alle abgeleiteten Klassen die Funktionen für die festgelegten Methoden bieten. Ein nützliches Tool, um die Implementierung von Methoden zu verlangen und gleichzeitig Unterklassen Flexibilität bei der Erfüllung dieser Anforderungen zu geben, ist der Dekorator abstractmethod.
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 nach mehr praktischen Python-Projekten suchst, schau dir unsere Liste der 60 besten Python-Projekte für Entwickler aller Niveaus an.
Wie das abc-Modul die Methodenimplementierung durchsetzt
Dank des Dekorators abstractmethod wird garantiert, dass jede Unterklasse einer abstrakten Klasse die dekorierten Methoden implementiert. Als Vorsichtsmaßnahme verhindert es, dass Unterklassen erstellt werden, die nicht die erforderlichen Fähigkeiten haben.
Python gibt eine TypeError-Fehlermeldung aus, wenn versucht wird, eine Unterklasse zu instanziieren, die nicht alle abstrakten Methoden überschreibt. Diese strenge Durchsetzung verringert die Wahrscheinlichkeit von Fehlern und verbessert die Code-Stabilität, indem sie Entwicklern hilft, Implementierungsfehler frühzeitig zu erkennen.
Außerdem stellt es sicher, dass alle konkreten Unterklassen das vorgesehene Verhalten und Design der abstrakten Klasse einhalten.
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 musst du zum Definieren einer abstrakten Klasse den Dekorator abstractmethod verwenden und eine Unterklasse von ABC erstellen. Auf diese Weise können Programmierer die Grundlagen für andere Klassen schaffen, indem sie die Methoden definieren, die verwendet werden müssen.
Hier ist eine ausführliche Schritt-für-Schritt-Anleitung:
- Hol die nötigen Module rein: Zuerst solltest du die Module
ABCundabstractmethodaus dem ModulABCimportieren. Um abstrakte Klassen und Methoden zu definieren, braucht man diese Tools. - Mach eine Klasse, die auf
ABCbasiert: Mach eine neue Klasse und legABCals ihren Erben fest. Die Klasse ist abstrakt und kann nicht direkt instanziiert werden, wie durch diese Vererbung angezeigt wird. - Definiere abstrakte Methoden mit
@abstractmethod: Um festzulegen, welche Methoden Unterklassen überschreiben müssen, benutze den Dekorator@abstractmethod. Im Grunde sind diese Methoden Platzhalter, die dafür sorgen, dass alle abgeleiteten Klassen die nötigen Operationen ausführen.
Schritt-für-Schritt-Beispiel für die Definition einer abstrakten Klasse
Hier 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
Das stellt sicher, dass die Funktionen start_engine und stop_engine von jeder Unterklasse von „Vehicle“ umgesetzt werden.
Praktisches Beispiel: Implementierung einer abstrakten Klasse
Schau dir mal eine ausführlichere Darstellung 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
Das zeigt, wie abstrakte Klassen Flexibilität bei der Implementierung bieten und gleichzeitig eine einheitliche Schnittstelle sicherstellen.
Beispiel für eine abstrakte Basisklasse in Python
Nachdem wir uns angesehen haben, wie abstrakte Basisklassen einen Vertrag für Unterklassen definieren, schauen wir uns jetzt an, wie konkrete Klassen diese Anforderungen erfüllen, indem sie alle abstrakten Methoden implementieren.
Konkrete Klasse, die von einer abstrakten Klasse abgeleitet ist
Eine Unterklasse, die alle abstrakten Methoden einer abstrakten Klasse umsetzt, nennen wir eine konkrete Klasse. Das heißt, die konkrete Klasse hat konkrete Implementierungen für alle Methoden, die man braucht, und erfüllt damit die Vorgaben der abstrakten Klasse.
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 lässt dich nicht einfach so eine abstrakte Klasse instanziieren. Weil es sicherstellt, dass jede von der abstrakten Klasse generierte Unterklasse den notwendigen Vertrag einhält, der durch ihre abstrakten Methoden bereitgestellt wird, ist das ein wichtiger Aspekt abstrakter Klassen.
Zum Beispiel wird eine TypeError ausgelöst, wenn du versuchst, appliance = Appliance()
Diese Einschränkung sorgt dafür, dass abstrakte Klassen nur als Blaupausen dienen und nicht falsch benutzt werden können. Python lässt zu, dass Instanzen von WashingMachine erstellt werden, während der in Appliance festgelegte Vertrag eingehalten wird, indem alle abstrakten Methoden in WashingMachine implementiert werden. Indem sichergestellt wird, dass jede in der abstrakten Klasse angegebene Funktion vollständig in ihren konkreten Unterklassen umgesetzt wird, verbessert diese Durchsetzung die Integrität der Codebasis.
Abstrakte Eigenschaften und Initialisierung
Auf dieser Grundlage wollen wir uns genauer anschauen, wie Python abstrakte Eigenschaften mithilfe der Dekoratoren @property und @abstractmethod unterstützt, sodass Entwickler neben Methoden auch die Konsistenz von Attributen sicherstellen können.
Verwendung abstrakter Eigenschaften in Python
Abstrakte Klassen können Eigenschaften festlegen, die Unterklassen zusätzlich zu Methoden implementieren müssen. Mit dieser Funktion können Entwickler eine einheitliche Schnittstelle für Eigenschaften festlegen, die Unterklassen zusätzlich zu Methoden deklarieren müssen.
Um sicherzustellen, dass jede Unterklasse ihre Implementierung bereitstellt, kannst du abstrakte Eigenschaften mit dem Dekorator @property zusammen mit @abstractmethod festlegen. Wenn du Klassen machst, die schreibgeschützte oder berechnete Attribute brauchen, die für die Funktion der Klasse wichtig sind, ist diese Methode echt praktisch.
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 die Funktion sound der Klasse Bird erfüllt.
Wann man abstrakte Klassen in Python benutzt
Abstrakte Klassen sind super für Sachen wie:
- Wenn du Frameworks oder Bibliotheken entwickelst, bei denen ein bestimmtes Verhalten durchgesetzt werden muss,: In komplizierten Systemen können abstrakte Klassen einheitliche Richtlinien oder Schnittstellen festlegen, an die sich alle Unterklassen halten müssen, um Konsistenz zu gewährleisten und Fehler zu reduzieren.
- Implementierung einheitlicher APIs über Klassen hinweg: Entwickler können sicherstellen, dass alle abgeleiteten Klassen eine einheitliche und vorhersehbare Art der Kommunikation mit der Anwendung oder Bibliothek bieten, indem sie abstrakte Methoden definieren.
- Bereitstellung eines grundlegenden Rahmens für eine Klassenhierarchie: Eine Hierarchie verwandter Klassen kann mithilfe abstrakter Klassen als Leitfaden erstellt werden. Durch die Möglichkeit, Unterklassen anzupassen und gemeinsam genutzte Verhaltensweisen und Eigenschaften in der abstrakten Klasse zu definieren, fördert diese Struktur die Wiederverwendbarkeit und reduziert Doppelarbeit.
Bewährte Verfahren
Wenn du einen genauen Vertrag für Unterklassen brauchst, nimm abstrakte Klassen. Abstrakte Klassen sind praktisch, wenn du eine bestimmte Struktur oder ein bestimmtes Verhalten auf mehrere abgeleitete Klassen anwenden musst. Sie helfen dabei, sicherzustellen, dass jede Unterklasse einem Standarddesign entspricht, was die Vorhersagbarkeit des Codes verbessert und die Wartung vereinfacht.
Wenn jede Methode eine Standardimplementierung haben kann, solltest du keine abstrakten Klassen verwenden. In manchen Fällen kann eine konkrete Basisklasse die bessere Wahl sein, um die Komplexität zu reduzieren und trotzdem die Wiederverwendbarkeit gemeinsamer Funktionen zu sichern.
Achte darauf, dass abstrakte Klassen klar und einfach sind und nur die wichtigsten Attribute und Methoden definieren. Es kann schwierig sein, eine abstrakte Klasse zu erstellen und zu pflegen, wenn sie zu viele Kriterien hat. Konzentrier dich lieber auf die wesentlichen Sachen, die die abgeleiteten Klassen haben müssen.
Fazit
Das OOP-Toolkit von Python hat abstrakte Klassen, die echt nützlich sind, weil sie Programmierern helfen, zuverlässige und wartungsfreundliche Programme zu schreiben. Du kannst die Übersichtlichkeit, Wiederverwendbarkeit und Erweiterbarkeit deiner Anwendungen verbessern, indem du abstrakte Klassen definierst und mit Hilfe des ABC-Moduls eine einheitliche Schnittstelle für alle Unterklassen durchsetzt. Besserer und zuverlässigerer Code lässt sich durch die Implementierung abstrakter Klassen erreichen, egal wie groß das System ist, an dem du arbeitest.
Egal, ob du robuste objektorientierte Programme entwickelst, einheitliche Schnittstellen durchsetzt oder skalierbare Anwendungen erstellst – wenn du Python-Abstraktklassen beherrschst, kannst du effizienteren und besser wartbaren Code schreiben. Verbessere noch heute deine Python-Kenntnisse mit unserem umfassenden Python-Grundlagen-Lernpfad.
Häufig gestellte Fragen zu abstrakten Klassen in Python
Wie definiert man eine abstrakte Methode in Python?
Eine abstrakte Methode wird mit dem Dekorator „ @abstractmethod ” aus dem Modul „ abc ” definiert. Es ist ein 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 löst einen Fehler „ TypeError ” aus, wenn du versuchst, ein Objekt einer abstrakten Klasse zu erstellen.
Wozu dient das Modul „abc“ in Python?
Das Modul „ abc ” hat die Klasse „ ABC ” und den Dekorator „ abstractmethod ”, mit denen man abstrakte Klassen und Methoden in Python definieren und durchsetzen kann.
Kann eine abstrakte Klasse normale (konkrete) Methoden haben?
Ja, eine abstrakte Klasse kann konkrete Methoden mit Implementierung haben. Diese Methoden können von Unterklassen übernommen und genutzt werden.

