Menu
Coddy logo textTech

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

challenge icon

Aufgabe

Mittel

In dieser Herausforderung implementieren Sie ein System, das Duck Typing mit verschiedenen dateiähnlichen Objekten demonstriert:

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