0Pricing
Python Academy · Lezione

Polimorfismo e duck typing

Scriva codice polimorfico che funzioni con qualsiasi oggetto compatibile.

Polimorfismo e duck typing è una lezione Python Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Python Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Python Academy include 4 lezioni in totale.

Introduzione

Il polimorfismo consente a oggetti diversi di rispondere alla stessa interfaccia. Il duck typing significa: se si comporta come un'anatra, è un'anatra.

Che cos'è il polimorfismo?

Polimorfismo significa «molte forme». Lo stesso nome di metodo funziona in modo diverso su oggetti diversi. Python fa ampio uso di questo principio.
class Cat:
    def speak(self): return 'Meow'
class Dog:
    def speak(self): return 'Woof'
for animal in [Cat(), Dog()]:
    print(animal.speak())

Duck typing

Python non richiede una gerarchia di classi per il polimorfismo. Se un oggetto dispone del metodo corretto, funziona. Non sono necessarie interfacce.
class Duck:
    def quack(self): return 'Quack'
class Person:
    def quack(self): return 'I am quacking like a duck'
def make_it_quack(duck):
    print(duck.quack())
make_it_quack(Duck())
make_it_quack(Person())

Funzioni polimorfiche

len() funziona su stringhe, liste, dizionari e tuple, perché tutti implementano __len__. Questo è polimorfismo integrato.
for obj in ['hello', [1,2,3], {'a':1}]:
    print(type(obj).__name__, len(obj))

Sovraccarico degli operatori

+ funziona su int, float, stringhe e liste, perché ciascun tipo implementa __add__ in modo diverso.
print(1 + 2)        # int addition
print('a' + 'b')    # string concat
print([1] + [2])    # list concat

Duck typing basato su protocolli

Il protocollo di iterazione: qualsiasi oggetto con __iter__ e __next__ funziona nei cicli for, senza bisogno di una classe base.
class Squares:
    def __init__(self, n): self.n,self.i=n,0
    def __iter__(self): return self
    def __next__(self):
        if self.i>=self.n: raise StopIteration
        x=self.i**2; self.i+=1; return x
print(list(Squares(5)))

EAFP vs LBYL

EAFP (Easier to Ask Forgiveness than Permission) utilizza try/except. LBYL (Look Before You Leap) utilizza if/hasattr. Python privilegia EAFP.
# LBYL:
if hasattr(obj, 'quack'):
    obj.quack()
# EAFP (Pythonic):
try:
    'hello'.quack()
except AttributeError:
    print('no quack')

isinstance() per un dispatch sicuro

Quando è necessario un comportamento specifico per tipo, isinstance() è più chiaro della gestione di AttributeError.
def process(data):
    if isinstance(data, str):
        return data.upper()
    elif isinstance(data, list):
        return [x*2 for x in data]
print(process('hi'))
print(process([1,2,3]))

Classi base astratte come protocolli

from abc import ABC, abstractmethod definisce protocolli formali. Le sottoclassi devono implementare i metodi astratti.
from abc import ABC, abstractmethod
class Drawable(ABC):
    @abstractmethod
    def draw(self): pass
class Circle(Drawable):
    def draw(self): print('O')
Circle().draw()

typing.Protocol (3.8+)

class MyProtocol(Protocol): definisce il sottotipaggio strutturale senza ABC. Funziona con mypy per i controlli statici.
from typing import Protocol
class Quackable(Protocol):
    def quack(self) -> str: ...
def make_quack(x: Quackable) -> str:
    return x.quack()
print('protocol demo')

Il polimorfismo nella pratica

Progetti API che accettino qualsiasi oggetto con l'interfaccia corretta. In questo modo il codice è estensibile senza doverlo modificare.
class JSONSerializer:
    def serialize(self, obj): import json; return json.dumps(obj)
class XMLSerializer:
    def serialize(self, obj): return f'<data>{obj}</data>'
def export(data, serializer):
    return serializer.serialize(data)
print(export({'x': 1}, JSONSerializer()))

Controllo rapido

Che cosa significa duck typing in Python?

Riepilogo

Polimorfismo: stessa interfaccia, comportamento diverso. Duck typing: conta il comportamento, non il tipo. I protocolli definiscono informalmente le interfacce. EAFP (try/except) è idiomatico in Python.

Continui

Ottimi progressi! Continui per padroneggiare il prossimo concetto.

Domande Frequenti

La lezione «Polimorfismo e duck typing» è gratuita?

Sì — il testo completo di «Polimorfismo e duck typing» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Python Academy, passa a CoddyKit PRO. Il corso Python Academy include 4 lezioni in totale.

Cosa imparerò in «Polimorfismo e duck typing»?

Scriva codice polimorfico che funzioni con qualsiasi oggetto compatibile. Eserciti Python Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Python Academy?

Non è richiesta alcuna esperienza precedente. Python Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «Polimorfismo e duck typing»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Python Academy?

Sì. Ogni lezione Python Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Ereditarietà singola
  2. Override dei metodi e super()
  3. Ereditarietà multipla e MRO
  4. Polimorfismo e duck typing
← Torna a Python Academy