Heim > Artikel > Backend-Entwicklung > 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:
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.
Duck Typing bietet mehrere Vorteile:
Es hat jedoch auch einige Nachteile:
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:
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:
Dieser Ansatz bietet uns mehrere Vorteile:
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.
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:
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!