Ereditarietà

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}."
Input
Output
alice=Person('Alice', 25); alice.introduce_yourself(); bob=Employee('Bob', 30, 'Engineer'); bob.introduce_yourself();
My name is Alice and I am 25 years old. My name is Bob, I am 30 years old, and my job title is Engineer.
 

Constraints

Time limit: 2 seconds

Memory limit: 512 MB

Output limit: 1 MB

To check your solution you need to sign in
Sign in to continue