Duck-Typing
Duck-Typing ist ein Konzept der objektorientierten Programmierung, bei dem der Typ eines Objektes nicht durch seine Klasse beschrieben wird, sondern durch das Vorhandensein bestimmter Methoden oder Attribute.[1]
Es handelt sich gewissermaßen um die Anwendung des Ententests in der Informatik, in Anlehnung an James Whitcomb Rileys Gedicht:
“When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck.”
„Wenn ich einen Vogel sehe, der wie eine Ente läuft, wie eine Ente schwimmt und wie eine Ente schnattert, dann nenne ich diesen Vogel eine Ente.“
Duck-Typing ist charakteristisch für objektorientierte Skriptsprachen wie Python, Groovy, PHP und Ruby.
Beim Duck-Typing wird zur Laufzeit des Programms geprüft, ob ein Objekt die entsprechenden Merkmale unterstützt. Dies führt wie bei allen dynamischen Typsystemen zu einer erhöhten Flexibilität, reduziert aber ebenso die Möglichkeit, statisch zur Übersetzungszeit Fehler im Programm zu finden. In Sprachen wie Java und D, sowie C# bis Version 3.0, ist es erforderlich, bei der Definition einer Klasse anzugeben, welche Interfaces implementiert werden sollen. Diese Sprachen erlauben es somit nicht, nach der Fertigstellung einer Klasse festzulegen, dass die Klasse zusätzlich noch ein anderes Interface implementiert (selbst wenn alle Methoden vorhanden wären, und die Objekte somit die gesamte Funktionalität bereitstellen würden).
In C++ bieten Funktionstemplates eine Art Duck-Typing zur Kompilierzeit. Ältere GCC-Versionen boten daneben auch sogenannte Signatures an. Diese lassen sich wie Interfaces deklarieren und nutzen, sie sind jedoch unabhängig von der Klassenhierarchie, sodass beispielsweise für eine Ente nicht erneut deklariert werden muss, dass sie schnattern kann, also die Signature implementiert. Dies entspricht den Interface genannten Strukturen in Go.
Beispiel
Python
Das folgende Codebeispiel in der Programmiersprache Python zeigt Ducktyping innerhalb einer Foreach-Schleife. Es wird erst zur Laufzeit geprüft, ob die Klasse des Objekts bird
die Methoden fly()
und swim()
deklariert.[2]
# Klassendeklariation mit den Methoden fly() und swim()
class Duck:
def fly(self):
print("The duck is flying")
def swim(self):
print("The duck is swimming")
# Klassendeklariation mit den Methoden fly() und swim()
class Swan:
def fly(self):
print("The swan is flying")
def swim(self):
print("The swan is swimming")
# Klassendeklariation mit den Methoden fly() und swimTest()
class Albatross:
def fly(self):
print("The albatross is flying")
def swimTest(self):
print("The albatross is swimming")
# Initialisierung einer Liste mit drei Objekten der drei verschiedenen Klassen
birds = [Duck(), Swan(), Albatross()]
# Foreach-Schleife mit Ducktyping
for bird in birds:
bird.fly()
bird.swim()
Das Programm erzeugt folgende Ausgabe:
The duck is flying The duck is swimming The swan is flying The swan is swimming The albatross is flying 'Albatross' object has no attribute 'swim'
Die Klassen Duck
und Swan
deklarieren die Methoden fly()
und swim()
. Diese werden zur Laufzeit aufgerufen. Die Klasse Albatross
deklariert nur die Methode fly()
. Die Methode swim()
kann nicht aufgerufen werden. Daher wird eine Fehlermeldung ausgegeben.
Weblinks
- GeeksforGeeks: Duck Typing in Python
- www.javatpoint.com: What is duck typing in Python?
Einzelnachweise
- Glossary — Python 3.11.1 documentation. In: docs.python.org. Abgerufen am 3. Februar 2023.
- Real Python: Duck Typing in Python: Writing Flexible and Decoupled Code