Eredità Python OOP: classi padre e figlio

Impara l'ereditarietà in Python OOP. Padronanza delle sottoclassi, sovrascrittura dei metodi, utilizzo di super() e modelli di ereditarietà multipli.

Prova nell'editor

Panoramica

L'ereditarietà è uno dei pilastri fondamentali della programmazione orientata agli oggetti (OOP). È un meccanismo che consente a una nuova classe (nota come figlia o sottoclasse) di adottare gli attributi e i metodi di una classe esistente (nota come genitore o superclasse). Questo modello di progettazione promuove il riutilizzo del codice, riduce la ridondanza e stabilisce relazioni logiche e gerarchiche tra i diversi componenti dell'applicazione.

Per implementare l'ereditarietà in Python, si passa il nome della classe genitore tra parentesi durante la definizione della classe figlia: `class Child(Parent):`. La classe figlia eredita immediatamente tutti i metodi e le variabili della classe genitore. Se il figlio necessita di un comportamento personalizzato, può sovrascrivere qualsiasi metodo genitore ridefinendolo con lo stesso nome. All'interno di un metodo sovrascritto, puoi comunque invocare l'implementazione del genitore utilizzando la funzione incorporata `super()`, assicurandoti di poter estendere anziché sostituire completamente la logica esistente.

A differenza di molti linguaggi tipizzati staticamente, Python supporta nativamente l'ereditarietà multipla, il che significa che una classe figlia può ereditare da più di una classe genitore (ad esempio, `class SmartDevice(Camera, Phone):`). Per risolvere quale metodo genitore viene eseguito quando i nomi sono in conflitto, Python utilizza un rigoroso algoritmo chiamato Method Risoluzione Order (MRO). Comprendere come strutturare gli alberi di ereditarietà e utilizzare super() è fondamentale per progettare architetture orientate agli oggetti estensibili.

Codice e output di esecuzione

Creazione di una classe Vehicle genitore e di una sottoclasse Car figlio che sovrascrive l'inizializzazione utilizzando super().

inheritance.py
Prova nell'editor
class Vehicle:
    def __init__(self, brand, year):
        self.brand = brand
        self.year = year

    def display_info(self):
        return f"{self.year} {self.brand}"

class Car(Vehicle):
    def __init__(self, brand, year, model):
        # Call parent constructor
        super().__init__(brand, year)
        self.model = model

    def display_info(self):
        # Override parent method and extend it
        parent_info = super().display_info()
        return f"{parent_info} {self.model}"

my_car = Car("Ford", 2026, "Mustang")
print(my_car.display_info())
Uscita terminale
2026 Ford Mustang

Implementazione passo dopo passo

  • Creazione di classi di eccezioni personalizzate che ereditano da Exception
  • Creazione di componenti dell'interfaccia utente (come i pulsanti) che ereditano da una vista generica
  • Definizione di modelli di database gerarchici (ad esempio, Utente, Dipendente, Manager)

Domande frequenti

Cosa fa super() nelle sottoclassi?

super() restituisce un oggetto temporaneo della classe genitore, permettendoti di chiamare i suoi metodi, il che è particolarmente utile per inizializzare i campi genitore in __init__.

È possibile impedire che una classe venga ereditata?

Python non supporta una parola chiave "finale" come Java per limitare l'ereditarietà. Convenzionalmente, documentiamo l'intento della classe o utilizziamo controlli di tipo con annotazioni @final dal modulo di digitazione.

Argomenti correlati

Risorse Python consigliate

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