Polimorfismo Python OOP: tipizzazione duck e interfacce

Padroneggiare il polimorfismo in Python. Scopri come scrivere codice flessibile e liberamente accoppiato utilizzando la tipizzazione duck, l'override dei metodi e le classi base astratte.

Prova nell'editor

Panoramica

Polimorfismo è un termine greco che significa "molte forme". Nella programmazione orientata agli oggetti, si riferisce alla capacità di classi diverse di rispondere alla stessa chiamata di metodo nel loro modo unico. Il polimorfismo consente di scrivere una singola funzione in grado di elaborare molti tipi diversi di oggetti, purché condividano un'interfaccia comune. Ciò consente un basso accoppiamento e rende i sistemi software altamente adattabili e facili da estendere.

In Python, il polimorfismo è profondamente legato a un concetto noto come Duck Typing. Il termine deriva dalla frase: "Se cammina come un'anatra e starnazza come un'anatra, allora deve essere un'anatra". In Python tipizzato dinamicamente, a una funzione non interessa a quale classe appartiene un oggetto; gli interessa solo se quell'oggetto implementa i metodi richiesti. Ad esempio, se hai una funzione che chiama `.speak()`, puoi passarle un cane, un gatto o un robot: purché abbiano tutti un metodo `.speak()`, il codice funziona perfettamente.

Per architetture più rigorose, Python fornisce classi base astratte (ABC) tramite il modulo `abc` integrato. Ereditando da "abc.ABC" e utilizzando il decoratore "@abstractmethod", puoi definire interfacce formali che le classi figlie sono costrette a implementare. Se una classe figlia non riesce a definire i metodi astratti, Python solleverà un TypeError quando proverai a istanziarla. Bilanciare la digitazione flessibile della papera con classi astratte formali è una competenza chiave per la progettazione di librerie Python resilienti.

Codice e output di esecuzione

Implementazione di classi polimorfiche che rappresentano forme che calcolano la loro area.

polymorphism_demo.py
Prova nell'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))
Uscita terminale
Calculated Area: 16.00
Calculated Area: 28.27

Implementazione passo dopo passo

  • Scrittura di processori di pagamento che gestiscono oggetti CreditCard, PayPal e Stripe
  • Disegnare vari elementi (testo, immagine) utilizzando un ciclo di rendering unificato
  • Simulazione delle connessioni API esterne durante i test unitari

Domande frequenti

Cos'è la Duck Typing?

È l'approccio dinamico di Python al polimorfismo. Verifica la presenza di metodi e proprietà in fase di esecuzione anziché verificare l'ereditarietà da una specifica classe genitore.

Puoi istanziare una classe base astratta?

No. Il tentativo di istanziare una classe che eredita da ABC e contiene metodi astratti solleverà un TypeError.

Argomenti correlati

Risorse Python consigliate

Espandi le tue conoscenze con tutorial interattivi, foglietti illustrativi e confronti di codici correlati.