


Duck Typing trifft auf Typhinweise: Verwenden von Protokollen in Python
Pythons dynamische Natur und die Unterstützung für Duck-Typing werden seit langem für ihre Flexibilität gelobt. Da die Codebasen jedoch größer und komplexer werden, werden die Vorteile der statischen Typprüfung immer offensichtlicher. Aber wie können wir die Flexibilität des Duck-Typings mit der Sicherheit der statischen Typprüfung in Einklang bringen? Geben Sie die Protokollklasse von Python ein.
In diesem Tutorial lernen Sie:
- Was Duck Typing ist und wie es in Python unterstützt wird
- Die Vor- und Nachteile des Duck-Typing
- Wie abstrakte Basisklassen (ABCs) versuchen, Tippprobleme zu lösen
- So nutzen Sie das Protokoll, um das Beste aus beiden Welten herauszuholen: Flexibilität beim Duck-Typing mit statischer Typprüfung
Duck Typing verstehen
Duck Typing ist ein Programmierkonzept, bei dem der Typ oder die Klasse eines Objekts weniger wichtig ist als die Methoden, die es definiert. Es basiert auf der Idee: „Wenn es wie eine Ente aussieht, wie eine Ente schwimmt und wie eine Ente quakt, dann ist es wahrscheinlich eine Ente.“
In Python wird Duck Typing vollständig unterstützt. Zum Beispiel:
class Duck: def quack(self): print("Quack!") class Person: def quack(self): print("I'm imitating a duck!") def make_it_quack(thing): # Note: No type hint here thing.quack() duck = Duck() person = Person() make_it_quack(duck) # Output: Quack! make_it_quack(person) # Output: I'm imitating a duck!
In diesem Beispiel ist make_it_quack die Art der Sache egal. Es interessiert nur, dass das Ding eine Quacksalbermethode hat. Beachten Sie, dass es keinen Typhinweis für den Thing-Parameter gibt, was typisch für Duck-Typ-Code ist, in größeren Codebasen jedoch zu Problemen führen kann.
Vor- und Nachteile von Duck Typing
Duck Typing bietet mehrere Vorteile:
- Flexibilität: Es ermöglicht flexibleren Code, der nicht an bestimmte Typen gebunden ist.
- Einfachere Code-Wiederverwendung: Sie können vorhandene Klassen ohne Änderungen in neuen Kontexten verwenden.
- Betonung des Verhaltens: Der Schwerpunkt liegt auf dem, was ein Objekt tun kann, und nicht darauf, was es ist.
Es hat jedoch auch einige Nachteile:
- Mangelnde Klarheit: Es kann unklar sein, welche Methoden ein Objekt implementieren muss.
- Laufzeitfehler: Typbezogene Fehler werden nur zur Laufzeit abgefangen.
- Weniger IDE-Unterstützung: IDEs haben Schwierigkeiten, eine genaue Autovervollständigung und Fehlerprüfung bereitzustellen.
Die ABC-Lösung
Ein Ansatz zur Lösung dieser Probleme ist die Verwendung von Abstract Base Classes (ABCs). Hier ist ein Beispiel:
from abc import ABC, abstractmethod class Quacker(ABC): @abstractmethod def quack(self): pass class Duck(Quacker): def quack(self): print("Quack!") class Person(Quacker): def quack(self): print("I'm imitating a duck!") def make_it_quack(thing: Quacker): thing.quack() duck = Duck() person = Person() make_it_quack(duck) make_it_quack(person)
Dieser Ansatz bietet zwar eine bessere Typprüfung und klarere Schnittstellen, hat aber auch Nachteile:
- Es erfordert Vererbung, was zu unflexiblen Hierarchien führen kann.
- Es funktioniert nicht mit vorhandenen Klassen, die Sie nicht ändern können.
- Es widerspricht Pythons „Duck-Typing“-Philosophie.
Protokolle: Das Beste aus beiden Welten
Python 3.8 führte die Protocol-Klasse ein, die es uns ermöglicht, Schnittstellen zu definieren, ohne dass eine Vererbung erforderlich ist. So können wir es verwenden:
from typing import Protocol class Quacker(Protocol): def quack(self):... class Duck: def quack(self): print("Quack!") class Person: def quack(self): print("I'm imitating a duck!") def make_it_quack(thing: Quacker): thing.quack() duck = Duck() person = Person() make_it_quack(duck) make_it_quack(person)
Lassen Sie uns das aufschlüsseln:
- Wir definieren ein Quacker-Protokoll, das die von uns erwartete Schnittstelle angibt.
- Unsere Duck- und Person-Klassen müssen von nichts erben.
- Wir können Typhinweise mit make_it_quack verwenden, um anzugeben, dass ein Quacker erwartet wird.
Dieser Ansatz bietet uns mehrere Vorteile:
- Statische Typprüfung: IDEs und Typprüfer können Fehler vor der Laufzeit erkennen.
- Keine Vererbung erforderlich: Vorhandene Klassen funktionieren, solange sie über die richtigen Methoden verfügen.
- Klare Schnittstellen: Das Protokoll definiert klar, welche Methoden erwartet werden.
Hier ist ein komplexeres Beispiel, das zeigt, wie Protokolle so komplex wie nötig sein können (Form), wobei Ihre Domänenklassen (Kreis, Rechteck) flach bleiben:
from typing import Protocol, List class Drawable(Protocol): def draw(self): ... class Resizable(Protocol): def resize(self, factor: float): ... class Shape(Drawable, Resizable, Protocol): pass def process_shapes(shapes: List[Shape]): for shape in shapes: shape.draw() shape.resize(2.0) # Example usage class Circle: def draw(self): print("Drawing a circle") def resize(self, factor: float): print(f"Resizing circle by factor {factor}") class Rectangle: def draw(self): print("Drawing a rectangle") def resize(self, factor: float): print(f"Resizing rectangle by factor {factor}") # This works with any class that has draw and resize methods, # regardless of its actual type or inheritance shapes: List[Shape] = [Circle(), Rectangle()] process_shapes(shapes)
In diesem Beispiel erben „Circle“ und „Rechteck“ nicht von „Shape“ oder einer anderen Klasse. Sie implementieren lediglich die erforderlichen Methoden (Zeichnen und Ändern der Größe). Die Funktion „process_shapes“ kann dank des Shape-Protokolls mit allen Objekten arbeiten, die über diese Methoden verfügen.
Zusammenfassung
Protokolle in Python bieten eine leistungsstarke Möglichkeit, statische Typisierung in Duck-Typ-Code zu integrieren. Sie ermöglichen es uns, Schnittstellen im Typsystem zu spezifizieren, ohne dass eine Vererbung erforderlich ist, wodurch die Flexibilität des Duck-Typings erhalten bleibt und gleichzeitig die Vorteile der statischen Typprüfung hinzugefügt werden
Durch die Verwendung von Protokollen können Sie:
- Definieren Sie klare Schnittstellen für Ihren Code
- Erhalten Sie eine bessere IDE (statische Typprüfung), Unterstützung und erkennen Sie Fehler früher
- Behalten Sie die Flexibilität des Duck-Typing bei
- Nutzen Sie die Typprüfung für Klassen, die Sie nicht ändern können.
Wenn Sie mehr über Protokolle und Typhinweise in Python erfahren möchten, sehen Sie sich die offizielle Python-Dokumentation zum Typisierungsmodul an oder erkunden Sie erweiterte statische Typprüfungstools wie mypy.
Viel Spaß beim Codieren, und mögen Ihre Enten immer mit der Typsicherheit quasseln!
Weitere meiner Inhalte, einschließlich meines Newsletters, finden Sie hier
Das obige ist der detaillierte Inhalt vonDuck Typing trifft auf Typhinweise: Verwenden von Protokollen in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

So verwenden Sie Python, um die ZiPF -Verteilung einer Textdatei zu finden

So herunterladen Sie Dateien in Python

Wie benutze ich eine schöne Suppe, um HTML zu analysieren?

Wie man mit PDF -Dokumenten mit Python arbeitet

Wie kann man mit Redis in Django -Anwendungen zwischenstrichen

Einführung des natürlichen Sprach -Toolkits (NLTK)

Wie führe ich ein tiefes Lernen mit Tensorflow oder Pytorch durch?
