Abstrakte Klassen und Methoden
Teil des Abschnitts Object Oriented Programming 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, abstractmethodErstellen 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 @abstractmethod-Decorator markiert Methoden, die von Unterklassen implementiert werden müssen – dies sind die „Pflichtfelder“ in Ihrem Formular. Reguläre Methoden wie describe() können Implementierungen haben und werden unverändert vererbt – dies sind die „vorausgefü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.
Versuchen Sie, eine Instanz der abstrakten Klasse zu erstellen:
# Dies wird einen Fehler verursachen:
# shape = Shape() # TypeError: Abstrakte Klasse kann nicht instanziiert werdenDieser Fehler ist beabsichtigt - es ist, als würde man versuchen, ein leeres Formular abzusenden. Python sagt: „Sie haben die erforderlichen Felder (Methoden area und perimeter) noch nicht ausgefüllt!“
Erstellen Sie 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, die instanziiert werden kann.
Jetzt können Sie Instanzen der konkreten Klasse erstellen:
circle = Circle(5)
print(circle.area())
print(circle.perimeter())
print(circle.describe()) # Geerbte konkrete MethodeErstellen 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
20Abstrakte 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.
Aufgabe
MittelIn dieser Challenge implementieren Sie ein Zahlungsverarbeitungssystem.
Sie müssen die Implementierung in diesen Dateien vervollständigen:
paymentmethod.py- Abstrakte Basisklasse mit Validierungslogikcreditcard.py- Implementierung der Kreditkartenzahlungpaypal.py- Implementierung der PayPal-Zahlung
Folgen Sie den TODO-Kommentaren in jeder Datei, um die erforderliche Funktionalität zu implementieren. Die Kommentare führen Sie Schritt für Schritt durch das Erstellen abstrakter Methoden, das Implementieren konkreter Unterklassen und das Einrichten korrekter Import-Beziehungen zwischen den Dateien.
Die Datei driver.py enthält Testfälle, die überprüfen, ob Ihre Implementierung korrekt funktioniert, verschiedene Zahlungsszenarien verarbeitet und die entsprechenden Details für jede Zahlungsmethode anzeigt.
Spickzettel
Abstrakte Klassen können nicht direkt instanziiert werden und enthalten abstrakte Methoden, die von Unterklassen implementiert werden müssen.
Importieren Sie das abc-Modul:
from abc import ABC, abstractmethodErstellen 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 @abstractmethod-Decorator markiert Methoden, die von Unterklassen implementiert werden müssen. Reguläre Methoden können Implementierungen haben.
Abstrakte Klassen können nicht instanziiert werden:
# Dies wird einen Fehler verursachen:
# shape = Shape() # TypeError: Can't instantiate abstract classErstellen Sie konkrete Unterklassen, die alle abstrakten Methoden implementieren:
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
circle = Circle(5)
print(circle.area()) # 78.5
print(circle.describe()) # Geerbte konkrete MethodeWichtiger Punkt: Abstrakte Klassen definieren eine Vorlage, der Unterklassen folgen müssen. Unterklassen müssen alle abstrakten Methoden implementieren, andernfalls sind sie ebenfalls abstrakt.
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 werdenDiese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Object Oriented Programming
1Grundlagen der OOP
Externe DateienEinführung in die OOPKlassen vs. ObjekteDer self-ParameterMethodenAttributeKonstruktor-Methode (__init__)Zusammenfassung – Einfacher Taschenrechner4Vererbung
Grundlagen der VererbungDie super()-FunktionMethoden überschreibenMehrfachvererbungMethod Resolution OrderZusammenfassung - Mitarbeiter-Hierarchie7Spezielle Methoden
Einführung in Magic MethodsOperator-ÜberladungMagic Methods für ContainerRückblick - Eigene Liste10Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster13Abschlussherausforderungen
E-Learning-PlattformBanksystemSpielcharakter-EntwicklungFahrzeugvermietung2Dekoratoren
Einführung in DekoratorenProperty-DekoratorStatischer Methoden-DekoratorKlassenmethoden-Dekorator5Polymorphismus
Methoden-Überschreiben vertieftDuck TypingAbstrakte Klassen und MethodenInterface-DesignZusammenfassung – Formen-Rechner8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungMixinsStatische und KlassenmethodenKlassendekoratorenContext Manager3Klasseneigenschaften
Instanz- vs. KlassenvariablenProperty-DekoratorenPrivate AttributeZusammenfassung – Bankkonto-Manager6Kapselung
Public, Protected, Private MemberZugriffsmodifikatorenInformation HidingProperty-Decorators für FortgeschritteneZusammenfassung - Studentenverwaltungssystem12Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen