Python-OOP-Polymorphismus: Duck-Typisierung und Schnittstellen

Meistern Sie den Polymorphismus in Python. Erfahren Sie, wie Sie mithilfe von Duck-Typing, Methodenüberschreibung und abstrakten Basisklassen flexiblen, lose gekoppelten Code schreiben.

Versuchen Sie es im Editor

Übersicht

Polymorphismus ist ein griechischer Begriff und bedeutet „viele Formen“. In der objektorientierten Programmierung bezieht es sich auf die Fähigkeit verschiedener Klassen, auf denselben Methodenaufruf auf ihre eigene, einzigartige Weise zu reagieren. Mit Polymorphismus können Sie eine einzelne Funktion schreiben, die viele verschiedene Objekttypen verarbeiten kann, sofern sie eine gemeinsame Schnittstelle haben. Dies ermöglicht eine geringe Kopplung und macht Ihre Softwaresysteme hochgradig anpassungsfähig und einfach erweiterbar.

In Python ist Polymorphismus eng mit einem Konzept verbunden, das als Duck Typing bekannt ist. Der Begriff leitet sich von dem Satz ab: „Wenn es geht wie eine Ente und es quakt wie eine Ente, dann muss es eine Ente sein.“ In dynamisch typisiertem Python ist es einer Funktion egal, zu welcher Klasse ein Objekt gehört; Es ist nur wichtig, ob dieses Objekt die angeforderten Methoden implementiert. Wenn Sie beispielsweise eine Funktion haben, die „.speak()“ aufruft, können Sie ihr einen Hund, eine Katze oder einen Roboter übergeben – solange sie alle über eine „.speak()“-Methode verfügen, läuft der Code perfekt.

Für strengere Architekturen stellt Python über das integrierte Modul „abc“ abstrakte Basisklassen (ABCs) bereit. Indem Sie von „abc.ABC“ erben und den „@abstractmethod“-Dekorator verwenden, können Sie formale Schnittstellen definieren, die untergeordnete Klassen zwangsweise implementieren müssen. Wenn eine untergeordnete Klasse die abstrakten Methoden nicht definieren kann, löst Python beim Versuch, sie zu instanziieren, einen TypeError aus. Das Ausbalancieren von flexiblem Duck-Typing mit formalen abstrakten Klassen ist eine Schlüsselkompetenz für den Entwurf belastbarer Python-Bibliotheken.

Code- und Ausführungsausgabe

Implementierung polymorpher Klassen, die Formen darstellen, die ihre Fläche berechnen.

polymorphism_demo.py
Versuchen Sie es im Editor
from abc import ABC, abstractmethod

class Shape(ABC):
    @abstractmethod
    def area(self):
        """Must be implemented by subclasses."""
        pass

class Square(Shape):
    def __init__(self, side):
        self.side = side
    def area(self):
        return self.side * self.side

class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius
    def area(self):
        import math
        return math.pi * (self.radius ** 2)

# Polymorphic function accepting any Shape
def print_area(shape: Shape):
    print(f"Calculated Area: {shape.area():.2f}")

print_area(Square(4))
print_area(Circle(3))
Terminal-Ausgabe
Calculated Area: 16.00
Calculated Area: 28.27

Schrittweise Umsetzung

  • Schreiben von Zahlungsprozessoren, die CreditCard-, PayPal- und Stripe-Objekte verarbeiten
  • Zeichnen verschiedener Elemente (Text, Bild) mithilfe einer einheitlichen Renderschleife
  • Verspotten externer API-Verbindungen während Unit-Tests

Häufig gestellte Fragen

Was ist Duck Typing?

Es ist Pythons dynamischer Ansatz zum Polymorphismus. Es prüft zur Laufzeit, ob Methoden und Eigenschaften vorhanden sind, anstatt die Vererbung von einer bestimmten übergeordneten Klasse zu überprüfen.

Können Sie eine abstrakte Basisklasse instanziieren?

Nein. Der Versuch, eine Klasse zu instanziieren, die von ABC erbt und abstrakte Methoden enthält, löst einen TypeError aus.

Verwandte Themen

Empfohlene Python-Ressourcen

Erweitern Sie Ihr Wissen mit zugehörigen interaktiven Tutorials, Spickzetteln und Codevergleichen.