L'ereditarietà è un concetto potente nella programmazione orientata agli oggetti. È un modo per organizzare il codice ed è particolarmente utile quando si hanno diverse classi correlate tra loro. L'ereditarietà permette a una classe di ereditare tutti i metodi e le proprietà da un'altra classe, promuovendo il riutilizzo del codice e stabilendo relazioni logiche tra le classi.
Per illustrare l'uso dell'ereditarietà in Python, consideriamo come esempio uno zoo. Uno zoo ospita vari animali come cani, gatti e uccelli. Sebbene questi animali abbiano comportamenti unici, condividono anche alcune caratteristiche comuni. In una situazione del genere, l'ereditarietà può aiutarci a evitare ripetizioni di codice e a rendere il codice più organizzato. Vediamo come:
class Animal: # Definizione della classe base Animal
def __init__(self, name, age): # Metodo costruttore con parametri name e age
self.name = name # Assegnazione dell'attributo name
self.age = age # Assegnazione dell'attributo age
def eat(self): # Metodo comune eat
return f'{self.name} is eating.'
def make_sound(self): # Metodo comune make_sound
return f'{self.name} makes a sound.'
class Dog(Animal): # Definizione della classe Dog che eredita da Animal
def make_sound(self): # Sovrascrittura del metodo make_sound
return f'{self.name} barks.'
class Cat(Animal): # Definizione della classe Cat che eredita da Animal
def make_sound(self): # Sovrascrittura del metodo make_sound
return f'{self.name} meows.'
class Bird(Animal): # Definizione della classe Bird che eredita da Animal
def eat(self): # Sovrascrittura del metodo eat per Bird
return f'{self.name} is pecking at its food.'
def make_sound(self): # Sovrascrittura del metodo make_sound
return f'{self.name} chirps.'
# Il metodo __init__ è ereditato da Animal
# ma puoi definire __init__ anche nelle classi derivate
dog = Dog('Rex', 5) # Creazione di un'istanza di Dog
cat = Cat('Whiskers', 3) # Creazione di un'istanza di Cat
bird = Bird('Tweety', 2) # Creazione di un'istanza di Bird
for animal in [dog, cat, bird]: # Iterazione sulle istanze
print(animal.eat()) # Chiamata al metodo eat ereditato o sovrascritto
print(animal.make_sound()) # Chiamata al metodo make_sound sovrascritto
print('-----')
L'output sarà:
Rex is eating.
Rex barks.
-----
Whiskers is eating.
Whiskers meows.
-----
Tweety is pecking at its food.
Tweety chirps.
-----
Nel codice sopra, Animal è la classe genitore, mentre Dog, Cat e Bird sono classi figlie. Le classi figlie ereditano tutti i metodi dalla classe Animal. Tuttavia, ogni classe figlia sovrascrive il metodo make_sound poiché il suono emesso da ciascun animale è unico. Abbiamo anche sovrascritto il metodo eat nella classe Bird perché il modo in cui gli uccelli mangiano è diverso dal comportamento generale di alimentazione definito nella classe Animal.
Questo approccio ci permette di rappresentare in modo più efficace oggetti del mondo reale e le loro relazioni, creando così una base di codice chiara, concisa e manutenibile. Quindi, l'ereditarietà ci consente di beneficiare del riutilizzo del codice e della riduzione della complessità.
Sfida: Classi Person & Employee
Ti viene chiesto di creare due classi Person e Employee.
La classe Person deve contenere i seguenti attributi:
name: Una stringa che rappresenta il nome della persona.
age: Un intero che rappresenta l'età della persona.
La classe Person deve anche contenere il seguente metodo:
introduce_yourself(): Questo metodo stampa una stringa nel seguente formato: "My name is {name} and I am {age} years old."
La classe Employee deve ereditare dalla classe Person e aggiungere il seguente attributo:
job_title: Una stringa che rappresenta il titolo di lavoro della persona.
La classe Employee deve anche sovrascrivere il seguente metodo:
introduce_yourself(): Questo metodo stampa una stringa nel seguente formato: "My name is {name}, I am {age} years old, and my job title is {job_title}."