Duck-Typing

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.

Der Name ergibt sich 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.“

James Whitcomb Riley

was übersetzt bedeutet: „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.“ (siehe dazu auch: Ententest) 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, D und C# 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 sind, und die Objekte somit die gesamte Funktionalität schon bereitstellen).

In C++ bieten Funktionstemplates eine Art Ducktyping zur Kompilier-Zeit. Ä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.

Beispiele

Python

Wir betrachten eine von Bird abgeleitete Klasse Duck und eine Liste von Objekten, bei denen es sich nur teilweise um echte Enten (Instanzen der Duck-Klasse) handelt:

class Bird: # implizit von ''object'' abgeleitet
    "Vögel haben einen Namen, den sie in ihrer Stringdarstellung auch nennen"
    def __init__(self, name):
        self.name = name
 
    def __str__(self):
        return self.__class__.__name__+' '+self.name
 
class Duck(Bird):
    "Enten sind Vögel, die außerdem quaken können"
    def quak(self):
        print str(self)+': quak'
 
ducks = [Bird('Gustav'), Duck('Donald'), object()]

Wir haben also einen Vogel Gustav, der keine Ente ist, eine Ente Donald sowie ein sonstiges Objekt; Vogelobjekte geben als ihre String-Darstellung ihre Klasse sowie ihren Namen zurück. Die Ausführung von

for duck in ducks:
    try:
        duck.quak()
    except AttributeError:
        print 'Keine Ente:', duck

erzeugt die Ausgabe

 Keine Ente: Bird Gustav
 Duck Donald: quak  Keine Ente: <object object at 0x00A20468>

Dasselbe Ergebnis würde

for duck in ducks:
    if hasattr(duck, 'quak'):
        duck.quak()
    else:
        print 'Keine Ente:', duck

zeigen; für das Duck-Typing entscheidend ist, dass wir die Klasse nicht (wie im folgenden Code) explizit überprüfen:

if isinstance(duck, Duck):
    duck.quak()

… sondern lediglich das Vorhandensein der relevanten Methode. Fügen wir jetzt eine Klasse Frog hinzu (auch Frösche können quaken), die mit Duck keine Verwandtschaftsbeziehung hat:

class Frog:
    def quak(self):
        print str(self)+': quak'
 
ducks.append(Frog())

Wie die Ausgabe

 Keine Ente: Bird Gustav
 Duck Donald: quak Keine Ente: <object object at 0x00A20468>
 <__main__.Frog instance at 0x00A886E8>: quak

zeigt, wird der Frosch als Ente akzeptiert – schließlich kann er quaken. Von Duck abgeleitet braucht er nicht zu sein.

Weitere Beispiele in Python sind StringIO-Objekte, die es erlauben, eine Zeichenkette wie eine Datei zu lesen, oder auch das Iterieren über die Zeilen einer Textdatei wie über die Elemente einer Liste.


Wikimedia Foundation.

Игры ⚽ Нужно сделать НИР?

Schlagen Sie auch in anderen Wörterbüchern nach:

  • Duck Typing — ist ein Konzept der Objektorientierung, das die Anwendbarkeit bestimmter Verfahren nicht an die Ableitung der Klasse von einer bestimmten Superklasse oder der förmlichen Implementierung einer Spezifikation knüpft, sondern an das Vorhandensein… …   Deutsch Wikipedia

  • Duck typing — Type systems Type safety Inferred vs. Manifest Dynamic vs. Static Strong vs. Weak Nominal vs. Structural Dependent typing Duck typing Latent typing Linear typing Uniqueness typing …   Wikipedia

  • Duck typing — En programmation informatique, le duck typing (traduction: typage canard) est un mode d interprétation du code source utilisé par certains langages de programmation orientés objet à typage dynamique. En duck typing, la sémantique d un objet, c… …   Wikipédia en Français

  • duck typing — noun A style of dynamic typing in which an objects current set of methods and properties determines the valid semantics, rather than its inheritance from a particular class or implementation of a specific interface …   Wiktionary

  • Duck (disambiguation) — Contents 1 Animals 2 Transportation 3 Computer software 4 …   Wikipedia

  • Duck Test — Sieht aus wie eine Ente, schwimmt wie eine Ente, quakt wie eine Ente: Das ist eine Ente Der Terminus Ententest (englisch duck test) beschreibt eine Methode einer analogen Begriffsbestimmung, wonach jemand versucht, die Natur eines bestimmten… …   Deutsch Wikipedia

  • Duck test — For the use of the duck test within the Wikipedia community, see Wikipedia:DUCK. A duck The duck test is a humorous term for a form of inductive reasoning. This is its usual expression …   Wikipedia

  • Dynamic typing — Dynamische Typisierung ist die Zuteilung des Typs einer Variablen zur Laufzeit eines Programms. Im Gegensatz zur statischen Typisierung verzichtet man auf eine explizite Typisierung; der Typ einer Variablen ergibt sich aus dem Typ des Werts, der… …   Deutsch Wikipedia

  • Latent typing — In computer programming, latent typing (as opposed to eager typing or manifest typing) is a style of typing that does not require (or perhaps even offer) explicit type declarations. Latent typing is heavily associated with duck typing and dynamic …   Wikipedia

  • Manifest typing — Type systems Type safety Inferred vs. Manifest Dynamic vs. Static Strong vs. Weak Nominal vs. Structural Dependent typing Duck typing Latent typing Linear typing Uniqueness typing …   Wikipedia

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”