Duck-Typing
Teil des Abschnitts Objektorientierte Programmierung der Python-Journey von Coddy. Lektion 24 von 64.
Duck-Typing konzentriert sich darauf, was ein Objekt tun kann, nicht darauf, was es ist. Wenn ein Objekt über die benötigten Methoden verfügt, kannst du es verwenden – unabhängig von seinem Klassentyp.
Hier sind zwei nicht verwandte Klassen mit denselben Methoden:
class Duck:
def swim(self):
return "Duck swimming"
def quack(self):
return "Quack!"
class Person:
def swim(self):
return "Person swimming"
def quack(self):
return "Person imitating a duck: Quack!"Beachte, dass Duck und Person nicht von derselben übergeordneten Klasse erben, aber beide über die Methoden swim() und quack() verfügen.
Erstellen Sie eine Funktion, die mit jedem „entenähnlichen“ Objekt funktioniert:
def make_it_swim_and_quack(duck_like_object):
print(duck_like_object.swim())
print(duck_like_object.quack())Diese Funktion kümmert sich nicht um den Typ des Objekts – sie setzt lediglich voraus, dass das Objekt die erforderlichen Methoden besitzt.
Verwenden Sie die Funktion mit beiden Klassen:
make_it_swim_and_quack(Duck())
make_it_swim_and_quack(Person())Ausgabe:
Duck swimming
Quack!
Person swimming
Person imitating a duck: Quack!Füge eine weitere „entenähnliche“ Klasse hinzu:
class Robot:
def swim(self):
return "Robot swimming with propellers"
def quack(self):
return "Robot sound: BEEP BEEP!"
make_it_swim_and_quack(Robot())Ausgabe:
Robot swimming with propellers
Robot sound: BEEP BEEP!Wichtiger Punkt: Duck-Typing ermöglicht Polymorphie ohne Vererbung. Wenn ein Objekt über die benötigten Methoden verfügt, kannst du es verwenden. Dadurch wird Python-Code flexibel und folgt dem Grundsatz „Es ist einfacher, um Verzeihung zu bitten als um Erlaubnis.“
Aufgabe
MittelIn dieser Herausforderung implementierst du ein System, das Duck-Typing mit verschiedenen dateiähnlichen Objekten demonstriert:
textfile.py: Implementiere die KlasseTextFilemit den Methodenread()undwrite(data)database.py: Implementiere die KlasseDatabasemit übereinstimmenden Methodensignaturennetworkresource.py: Implementiere die KlasseNetworkResourcemit übereinstimmenden Methodensignaturendriver.py– Implementiere Testfälle, die überprüfen, ob deine Implementierung korrekt funktioniert
Jede Datei enthält detaillierte TODO-Kommentare, die dich bei der Implementierung anleiten.
Probier es selbst
# TODO: Importiere die TextFile-Klasse aus textfile.py
# TODO: Importiere die Database-Klasse aus database.py
# TODO: Importiere die NetworkResource-Klasse aus networkresource.py
def process_data(data_source, data):
# TODO: Rufe die read()-Methode auf data_source auf und gib das Ergebnis aus
# TODO: Rufe die write(data)-Methode auf data_source auf und gib das Ergebnis aus
pass
# Test mit verschiedenen Datenquellen - DIESEN TESTCODE NICHT ÄNDERN
text_file = TextFile()
database = Database()
network = NetworkResource()
print("Processing text file:")
process_data(text_file, "Hello, world!")
print("\
Processing database:")
process_data(database, "User record")
print("\
Processing network resource:")
process_data(network, "GET request")Diese 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
Externe DateienEinführung in die OOPKlassen vs. ObjekteDer self-ParameterMethodenAttributeKonstruktormethode (__init__)Zusammenfassung – 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