Duck Typing in Python – 3 Praktische Beispiele

Praktische Beispiele

In Python können wir durch Iteration eine Liste von Elementen durchgehen, um bestimmte Operationen auszuführen. Eine gängige Methode zum Erstellen einer Iteration besteht darin, die Schleifen for zu verwenden, die das folgende allgemeine Format haben.

for i in iterable:
expression

Wie in meinem vorherigen Artikel beschrieben, können wir unsere benutzerdefinierten Iteratoren erstellen, die als Iterable in den for Schleifen verwendet werden können. Um die „Ententests“ für Iteratoren zu erfüllen, muss die benutzerdefinierte Klasse die Methoden __iter__() und __next__() implementieren. Ein konkretes Beispiel ist unten angegeben.

Durch Eingabe von Iteratoren

Im obigen Codeausschnitt haben wir sowohl __iter__() – als auch __next__() -Methoden implementiert, die die Instanzen der benutzerdefinierten Klasse Cubes iterieren, sodass die Instanz in einer for -Schleife verwendet werden konnte.

Callables

Neben dem integrierten Datentyp dict ist defaultdict ein weiterer wichtiger Wörterbuchtyp, der im Modul collections verfügbar ist. Dieser wörterbuchähnliche Datentyp hat den folgenden Konstruktor: defaultdict(]). Insbesondere ist das Argument default_factory ein aufrufbarer Typ, z. B. eine Funktion oder eine Lambda-Funktion.

In meinem vorherigen Artikel habe ich gezeigt, dass wir defaultdict durch Übergeben einer Lambda-Funktion verwenden können. Hier ist das Beispiel seiner Verwendung.

>>> from collections import defaultdict
>>> letter_counts = defaultdict(lambda: 0)
>>> for i in 'abcddddeeeee':
... letter_counts += 1
...
>>> letter_counts.items()
dict_items()

Insbesondere können wir den Datentyp defaultdict flexibler verwenden, wenn wir unsere eigene Standardfabrik erstellen. Mit der „Duck Typing“ -Philosophie muss die benutzerdefinierte Klasse die __call__() -Methode implementieren, um etwas aufrufbar zu machen. Mal sehen, wie es funktioniert.

Durch Eingabe von Callables

Wie im obigen Code gezeigt, erstellen wir die DucklingFactory -Klasse, deren __call__() -Funktion eine Liste einer Duckling -Instanz zurückgibt. Mit dieser Factory-Funktion können wir die gewünschte Anzahl von Entenküken erstellen, indem wir die Standard-Entenliste multiplizieren.

Sortieren mit Len()

Eine weitere mögliche Verwendung von Duck Typing ist die Implementierung der benutzerdefinierten Funktion len() , die zum Sortieren einer Liste mit der Funktion sort() verwendet werden kann. Als Randnotiz bezeichnen einige Leute die Funktion len() als magische Funktion, da sie durch Aufrufen der Funktion __len__() hinter den Kulissen implementiert wird (diese Funktionen mit doppelten Unterstrichen als Präfix und Suffix werden als magische Funktionen bezeichnet).

Angenommen, wir möchten eine Liste von Enten basierend auf der Länge des Namens jeder Ente sortieren. Hier ist, wie wir die Ente Typisierung in diesem Fall anwenden können.

Nach Eingabe von

Im obigen Codeausschnitt implementiert die benutzerdefinierte Klasse NamedDuck die Funktionen __str__() und __len__() , mit denen wir die Funktionen str() und len() für ihre Instanzen in Zeile 10 bzw. 12 verwenden können. Wie Sie sehen, können alle Elemente, obwohl die Liste mit benannten Elementen und Zeichenfolgen gemischt ist, die Funktionen str() und len() aufrufen, sodass die Liste mit len() als Schlüssel sortiert und im Listenverständnis verwendet werden kann, wenn wir das sortierte Ergebnis ausdrucken möchten.

Daher ist die breitere Implikation dieser Verwendung, dass, wenn wir eine gemischte Liste von Elementen verschiedener Datentypen haben, solange jeder Datentyp die gleichen Funktionen implementiert, die Elemente die Ententests bestehen und mit den richtigen Operationen angewendet werden. Hier ist ein allgemeines Anwendungsbeispiel mit der Funktion len() für eine gemischte Liste von Datentypen von str, tuple und list .

>>> mixed_list = ]
>>> mixed_list.sort(key=len)
>>> mixed_list
, (1, 2), 'Amazing']

You might also like

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.