Abstrakte Klassen und Methoden
Teil des Abschnitts Objektorientierte Programmierung der Python-Journey von Coddy. Lektion 25 von 64.
Abstrakte Klassen sind Klassen, von denen keine Instanzen direkt erstellt werden können und die abstrakte Methoden enthalten, die von Unterklassen implementiert werden müssen.
Stell es dir wie ein Formular vor: Eine abstrakte Klasse ist wie ein obligatorisches Formular, bei dem einige Felder Pflichtfelder (abstrakte Methoden) und andere optional sind (konkrete Methoden). Du kannst das Formular selbst nicht einreichen – du musst zuerst alle Pflichtfelder ausfüllen. Ebenso kannst du keine Instanzen einer abstrakten Klasse erstellen, solange nicht alle abstrakten Methoden in einer Unterklasse implementiert sind.
Importiere das abc-Modul, um abstrakte Klassen zu erstellen:
from abc import ABC, abstractmethodErstelle 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 @abstractmethod-Decorator kennzeichnet Methoden, die von Unterklassen implementiert werden müssen – das sind die „Pflichtfelder“ in deinem Formular. Reguläre Methoden wie describe() können Implementierungen haben und werden unverändert vererbt – das sind die „vorausgefüllten Felder“.
Warum abstrakte Klassen verwenden? Sie erzwingen einen Vertrag. Wenn du eine Klasse Shape erstellst, sagst du damit: „Jede Form MUSS ihre Fläche und ihren Umfang berechnen können.“ Das verhindert Fehler, bei denen du vergessen könntest, wichtige Methoden zu implementieren.
Versuche, eine Instanz der abstrakten Klasse zu erstellen:
# Dies führt zu einem Fehler:
# shape = Shape() # TypeError: Can't instantiate abstract classDieser Fehler ist beabsichtigt – es ist, als würdest du versuchen, ein leeres Formular abzuschicken. Python sagt: „Du hast die erforderlichen Felder (Flächeninhalt 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.radiusJetzt 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 kannst du Instanzen der konkreten Klasse erstellen:
circle = Circle(5)
print(circle.area())
print(circle.perimeter())
print(circle.describe()) # Geerbte konkrete MethodeErstelle 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
20Abstrakte Klassen definieren einen Vertrag, an den sich Unterklassen halten müssen. Verwende ABC und @abstractmethod, um abstrakte Klassen zu erstellen. Unterklassen müssen alle abstrakten Methoden implementieren, andernfalls sind auch sie abstrakt. Das gewährleistet Konsistenz und verhindert unvollständige Implementierungen.
Aufgabe
MittelIn dieser Herausforderung implementierst du ein Zahlungsabwicklungssystem.
Du musst die Implementierung in diesen Dateien vervollständigen:
paymentmethod.py– Abstrakte Basisklasse mit Validierungslogikcreditcard.py– Implementierung der Kreditkartenzahlungpaypal.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, das Implementieren konkreter Unterklassen und das Herstellen korrekter Importbeziehungen zwischen den Dateien.
Die Datei driver.py enthält Testfälle, mit denen überprüft wird, ob deine Implementierung korrekt funktioniert. Dabei werden verschiedene Zahlungsszenarien verarbeitet und für jede Zahlungsmethode die entsprechenden Details angezeigt.
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")
# Gültige Zahlungen verarbeiten
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())
# Einen ungültigen Betrag ausprobieren
if not pp.validate(0):
print("Invalid payment amount")
# Dies würde einen Fehler auslösen, wenn die Auskommentierung entfernt würde:
# pm = PaymentMethod() # Abstrakte Klasse kann nicht instanziiert werdenDiese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Einführung in OOPExterne DateienKlassen vs. ObjekteDer self-ParameterMethodenAttributeKonstruktormethode (__init__)Rückblick – Einfacher Taschenrechner4Vererbung
Grundlegende VererbungDie super()-FunktionMethodenüberschreibungMehrfachvererbungMethodenauflösungsreihenfolgeWiederholung – Mitarbeiterhierarchie7Spezielle Methoden
Einführung in magische MethodenOperatorüberladungMagische Methoden für ContainerRückblick – Benutzerdefinierte Liste10Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster13Abschließende Herausforderungen
E-Learning-PlattformBankensystemEntwicklung von SpielfigurenFahrzeugvermietungsservice2Dekoratoren
Einführung in DekoratorenProperty-DekoratorDekorator für statische MethodenDekorator für Klassenmethoden5Polymorphie
Methodenüberschreibung erneut betrachtetDuck-TypingAbstrakte Klassen und MethodenSchnittstellendesignRückblick – Formrechner8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungMixinsStatische Methoden und KlassenmethodenKlassen-DekoratorenKontextmanager3Klassenattribute
Instanz- vs. KlassenvariablenProperty-DecoratorsPrivate AttributeWiederholung – Bankkontoverwaltung6Kapselung
Öffentliche, geschützte, private MemberZugriffsmodifikatorenInformationsverbergungProperty-Decorators – FortgeschrittenWiederholung – System zur Verwaltung von Studentendaten12Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und BenutzerklassenAusleihsystemSuchfunktionAdministrationsoberflächeTests und IntegrationÜbe selbstständig: Online-Python-Compiler