Menu
Coddy logo textTech

Abstrakte Klassen und Methoden

Teil des Abschnitts Objektorientierte Programmierung der Python-Journey von Coddy. Lektion 25 von 64.

Abstrakte Klassen sind Klassen, die nicht direkt instanziiert werden können und abstrakte Methoden enthalten, die von Unterklassen implementiert werden müssen.

Stellen Sie es sich wie ein Formular vor: Eine abstrakte Klasse ist wie ein obligatorischer Formularcode, bei dem einige Felder erforderlich sind (abstrakte Methoden) und andere optional sind (konkrete Methoden). Sie können das Formular selbst nicht absenden – Sie müssen zuerst alle erforderlichen Felder ausfüllen. Ebenso können Sie keine Instanzen einer abstrakten Klasse erstellen, bis alle abstrakten Methoden in einer Unterklasse implementiert sind.

Importieren Sie das abc-Modul, um abstrakte Klassen zu erstellen:

from abc import ABC, abstractmethod

Erstellen Sie eine abstrakte Klasse mit abstrakten Methoden:

class Shape(ABC):
    @abstractmethod
    def area(self):
        pass
    
    @abstractmethod
    def perimeter(self):
        pass
    
    def describe(self):
        return "This is a shape"  # Konkrete Methode (hat eine Implementierung)

Der Decorator @abstractmethod kennzeichnet Methoden, die von Unterklassen implementiert werden müssen – dies sind die „Pflichtfelder“ in deinem Formular. Reguläre Methoden wie describe() können Implementierungen enthalten und unverändert vererbt werden – dies sind die „vorab ausgefüllten Felder“.

Warum abstrakte Klassen verwenden? Sie erzwingen einen Vertrag. Wenn Sie eine Shape-Klasse erstellen, sagen Sie: „Jede Form MUSS in der Lage sein, ihren Flächeninhalt und Umfang zu berechnen.“ Dies verhindert Fehler, bei denen Sie vergessen könnten, kritische Methoden zu implementieren.

Versuche, eine Instanz der abstrakten Klasse zu erstellen:

# Dies wird einen Fehler verursachen:
# shape = Shape()  # TypeError: Can't instantiate abstract class

Dieser Fehler ist beabsichtigt – es ist, als würdest du versuchen, ein leeres Formular abzusenden. Python sagt: „Du hast die erforderlichen Felder (Flächen- und Umfangsmethoden) noch nicht ausgefüllt!“

Erstelle eine konkrete Unterklasse, die alle abstrakten Methoden implementiert:

class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius
    
    def area(self):
        return 3.14 * self.radius ** 2
    
    def perimeter(self):
        return 2 * 3.14 * self.radius

Jetzt haben wir „alle erforderlichen Felder ausgefüllt“ – wir haben sowohl area() als auch perimeter() implementiert. Die Klasse Circle ist nun eine vollständige, konkrete Klasse, von der Instanzen erstellt werden können.

Jetzt können Sie Instanzen der konkreten Klasse erstellen:

circle = Circle(5)
print(circle.area())
print(circle.perimeter())
print(circle.describe())  # Geerbte konkrete Methode

Erstellen Sie eine weitere konkrete Unterklasse:

class Rectangle(Shape):
    def __init__(self, width, height):
        self.width = width
        self.height = height
    
    def area(self):
        return self.width  self.height
    
    def perimeter(self):
        return 2 * (self.width + self.height)

rectangle = Rectangle(4, 6)
print(rectangle.area())
print(rectangle.perimeter())

Ausgabe:

78.5
31.400000000000002
This is a shape
24
20

Abstrakte Klassen definieren einen Vertrag, dem Unterklassen folgen müssen. Verwenden Sie ABC und @abstractmethod, um abstrakte Klassen zu erstellen. Unterklassen müssen alle abstrakten Methoden implementieren, andernfalls sind sie ebenfalls abstrakt. Dies gewährleistet Konsistenz und verhindert unvollständige Implementierungen.

challenge icon

Aufgabe

Mittel

In dieser Herausforderung implementierst du ein Zahlungsabwicklungssystem.

Du musst die Implementierung in diesen Dateien vervollständigen:

  • paymentmethod.py – Abstrakte Basisklasse mit Validierungslogik
  • creditcard.py – Implementierung der Kreditkartenzahlung
  • paypal.py – Implementierung der PayPal-Zahlung

Folge den TODO-Kommentaren in jeder Datei, um die erforderliche Funktionalität zu implementieren. Die Kommentare führen dich Schritt für Schritt durch das Erstellen abstrakter Methoden, die Implementierung konkreter Unterklassen und das Herstellen korrekter Importbeziehungen zwischen den Dateien.

Die Datei driver.py enthält Testfälle, die überprüfen, ob deine Implementierung korrekt funktioniert, indem sie verschiedene Zahlungsszenarien verarbeitet und passende Details für jede Zahlungsmethode anzeigt.

Probier es selbst

from creditcard import CreditCard
from paypal import PayPal

# Teste die Implementierungen - DIESEN TESTCODE NICHT ÄNDERN
cc = CreditCard("1234567890123456")
pp = PayPal("user@example.com")

# Verarbeite gültige Zahlungen
if cc.validate(100):
    print(cc.process_payment(100))
    print(cc.payment_details())

if pp.validate(200):
    print(pp.process_payment(200))
    print(pp.payment_details())

# Versuche einen ungültigen Betrag
if not pp.validate(0):
    print("Invalid payment amount")

# Dies würde einen Fehler auslösen, wenn die Auskommentierung aufgehoben würde:
# pm = PaymentMethod()  # Abstrakte Klasse kann nicht instanziiert werden
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-Python-Compiler