Menu
Coddy logo textTech

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.“

challenge icon

Aufgabe

Mittel

In dieser Herausforderung implementierst du ein System, das Duck-Typing mit verschiedenen dateiähnlichen Objekten demonstriert:

  • textfile.py: Implementiere die Klasse TextFile mit den Methoden read() und write(data)
  • database.py: Implementiere die Klasse Database mit übereinstimmenden Methodensignaturen
  • networkresource.py: Implementiere die Klasse NetworkResource mit übereinstimmenden Methodensignaturen
  • driver.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")
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