
La differenza tra overriding e overwriting dei metodi in Python
Due concetti fondamentali nella programmazione orientata agli oggetti (OOP) in Python: overriding e overwriting. Questi concetti sono spesso confusi, ma hanno differenze importanti nell'ereditarietà dei metodi da una classe base.
- Overriding
La classe derivata eredita ed estende il comportamento di un metodo della classe base. - Overwriting
La classe derivata rimpiazza completamente il comportamento di un metodo della classe base.
Sono due concetti essenziali per progettare classi che sfruttano l'ereditarietà in modo efficace, perché ti permettono di riutilizzare il codice e di personalizzare il comportamento delle classi derivate. Andiamo a esplorarli insieme.
Overriding dei metodi
L'overriding si verifica quando una classe derivata (o sottoclasse) eredita ed espande un metodo definito nella classe base (o superclasse).
Questo consente alla sottoclasse di personalizzare o estendere il comportamento del metodo ereditato dalla superclasse.
Ad esempio, definisci questa classe base chiamata `Animale`:
class Animale:
def suono(self):
print('Il suono di questo animale è: ')
Poi definisci una sottoclasse chiamata `Cane` che eredita metodi e attributi dalla classe `Animale`.
class Cane(Animale):
def suono(self):
super().suono()
return "Bau Bau!"
La classe derivata chiama il metodo suono() della classe base tramite la funzione super() e aggiunge una riga di codice.
Ora crea un'istanza della classe Cane.
cane = Cane()
Chiama il metodo suono() dall'istanza.
print(cane.suono())
Il suono di questo animale è:
Bau Bau!
L'istanza esegue sia il metodo suono() della classe base `Animale` e sia l'estensione aggiunta nella classe `Cane`.
Overwriting dei metodi
L'overwriting consiste nella sovrascrittura di un metodo della classe base.
Si verifica quando una classe derivata (o sottoclasse) ha una propria implementazione di un metodo già definito nella sua classe base (o superclasse) che viene rimpiazzato e sostituito, senza chimarlo.
Ad esempio, immagina di avere una classe base chiamata `Animale` che ha un metodo chiamato `suono`:
class Animale:
def suono(self):
print('Il suono di questo animale è: ')
Poi crea una sottoclasse chiamata `Cane` che eredita metodi e attributi dalla classe `Animale`.
class Cane(Animale):
def suono(self):
return "Bau Bau!"
In questo caso non c'è la funzione super() nel metodo suono(). Quindi la classe `Cane` sovrascrive completamente il metodo suono() della classe madre.
Ora crea un'istanza della classe Cane.
cane = Cane()
Chiama il metodo suono() dall'istanza.
print(cane.suono())
Bau Bau!
Come puoi vedere, la classe `Cane` ha il suo comportamento personalizzato per il metodo suono(), che sostituisce quello della classe base `Animale`.
In questo caso, la prima definizione del metodo suono() viene completamente ignorata perché la seconda la sovrascrive.
Spero che questa guida ti abbia aiutato a chiarire i concetti di overriding e overwriting.