Duck Typing
Teil des Abschnitts Object Oriented Programming 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 die Methoden besitzt, die Sie benötigen, können Sie 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!"Beachten Sie, dass Duck und Person nicht von derselben Elternklasse erben, aber beide über swim()- und quack()-Methoden 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!Kernpunkt: Duck Typing ermöglicht Polymorphismus ohne Vererbung. Wenn ein Objekt über die Methoden verfügt, die Sie benötigen, können Sie es verwenden. Dies macht Python-Code flexibel und folgt dem Prinzip „Es ist einfacher, um Verzeihung zu bitten als um Erlaubnis“.
Aufgabe
MittelIn dieser Herausforderung implementieren Sie ein System, das Duck Typing mit verschiedenen dateiähnlichen Objekten demonstriert:
textfile.py: Implementieren Sie die KlasseTextFilemit den Methodenread()undwrite(data)database.py: Implementieren Sie die KlasseDatabasemit übereinstimmenden Methodensignaturennetworkresource.py: Implementieren Sie die KlasseNetworkResourcemit übereinstimmenden Methodensignaturendriver.py– Implementieren Sie Testfälle, die überprüfen, ob Ihre Implementierung korrekt funktioniert
Jede Datei enthält detaillierte TODO-Kommentare, die Sie bei der Implementierung unterstützen.
Spickzettel
Duck-Typing konzentriert sich darauf, was ein Objekt tun kann, nicht darauf, was es ist. Wenn ein Objekt über die Methoden verfügt, die Sie benötigen, können Sie es unabhängig von seinem Klassentyp verwenden.
Beispiel für Duck-Typing mit nicht verwandten Klassen, die dieselben Methoden teilen:
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!"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())
# Works with any object that has swim() and quack() methods
make_it_swim_and_quack(Duck())
make_it_swim_and_quack(Person())Duck-Typing ermöglicht Polymorphismus ohne Vererbung – wenn ein Objekt die benötigten Methoden besitzt, können Sie es verwenden. Dies macht Python-Code flexibel und folgt dem Prinzip „Es ist einfacher, um Verzeihung zu bitten als um Erlaubnis“ (it's easier to ask forgiveness than permission).
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 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