domenica 19 ottobre 2025

Corso di Python: 7 – Programmazione a Oggetti

7. Programmazione a Oggetti (OOP)

Obiettivi didattici:

  • Comprendere i concetti di classe e oggetto.

  • Imparare a definire attributi e metodi.

  • Approfondire ereditarietà e polimorfismo.

  • Applicare la OOP per simulazioni pratiche (es. conto bancario).


1. Cos’è la Programmazione a Oggetti (OOP)

La OOP è un paradigma che organizza il codice attorno a oggetti che rappresentano entità reali o concettuali.
Ogni oggetto ha:

  • Attributi: caratteristiche/variabili dello stato dell’oggetto.

  • Metodi: funzioni che descrivono i comportamenti dell’oggetto.

Vantaggi:

  • Incapsulamento (stato e comportamenti insieme).

  • Riutilizzabilità (ereditarietà).

  • Estendibilità e manutenzione più facile.


2. Classi e Oggetti

Definizione di classe: modello o blueprint per creare oggetti.

class Persona:
    def __init__(self, nome, eta):
        self.nome = nome
        self.eta = eta

    def saluta(self):
        print(f"Ciao, mi chiamo {self.nome} e ho {self.eta} anni.")

Creazione di oggetti:

p1 = Persona("Mario", 30)
p2 = Persona("Luisa", 25)

p1.saluta()  # Ciao, mi chiamo Mario e ho 30 anni.
p2.saluta()  # Ciao, mi chiamo Luisa e ho 25 anni.

Spiegazione:

  • __init__ è il costruttore, viene eseguito alla creazione dell’oggetto.

  • self rappresenta l’oggetto stesso.

  • Attributi: self.nome, self.eta.

  • Metodi: saluta().


3. Attributi e Metodi

  • Attributi di istanza: specifici per ogni oggetto (self.nome).

  • Attributi di classe: condivisi da tutti gli oggetti (Classe.nome_attr).

Esempio attributo di classe:

class Studente:
    universita = "Politecnico"  # attributo di classe condiviso

    def __init__(self, nome):
        self.nome = nome  # attributo di istanza

s1 = Studente("Anna")
s2 = Studente("Luca")

print(s1.universita)  # Politecnico
print(s2.universita)  # Politecnico

4. Ereditarietà

Permette di creare sottoclassi che ereditano attributi e metodi di una superclasse.

class Animale:
    def __init__(self, nome):
        self.nome = nome

    def parla(self):
        pass  # metodo generico

class Cane(Animale):
    def parla(self):
        print(f"{self.nome} dice Bau!")

class Gatto(Animale):
    def parla(self):
        print(f"{self.nome} dice Miao!")

c = Cane("Fido")
g = Gatto("Micio")

c.parla()  # Fido dice Bau!
g.parla()  # Micio dice Miao!

Polimorfismo: oggetti di classi diverse rispondono allo stesso metodo (parla) in modi differenti.


5. Esercizio pratico: Simulazione di un conto bancario

Obiettivo: creare una classe ContoBancario con deposito, prelievo e saldo.

class ContoBancario:
    def __init__(self, titolare, saldo_iniziale=0):
        self.titolare = titolare
        self.saldo = saldo_iniziale

    def deposita(self, importo):
        self.saldo += importo
        print(f"Depositati {importo}€. Saldo attuale: {self.saldo}€")

    def preleva(self, importo):
        if importo <= self.saldo:
            self.saldo -= importo
            print(f"Prelevati {importo}€. Saldo attuale: {self.saldo}€")
        else:
            print("Fondi insufficienti!")

    def mostra_saldo(self):
        print(f"Saldo attuale di {self.titolare}: {self.saldo}€")

Utilizzo della classe:

conto1 = ContoBancario("Mario Rossi", 1000)
conto1.deposita(500)   # Depositati 500€. Saldo attuale: 1500€
conto1.preleva(200)    # Prelevati 200€. Saldo attuale: 1300€
conto1.mostra_saldo()  # Saldo attuale di Mario Rossi: 1300€

6. Esercizio avanzato: ereditarietà nel conto bancario

class ContoRisparmio(ContoBancario):
    def __init__(self, titolare, saldo_iniziale=0, interesse=0.02):
        super().__init__(titolare, saldo_iniziale)
        self.interesse = interesse

    def applica_interesse(self):
        self.saldo += self.saldo * self.interesse
        print(f"Interesse applicato. Nuovo saldo: {self.saldo}€")

conto2 = ContoRisparmio("Luisa Bianchi", 1000)
conto2.applica_interesse()  # Interesse applicato. Nuovo saldo: 1020.0€

Spiegazione:

  • super().__init__() richiama il costruttore della superclasse.

  • La sottoclasse aggiunge nuovi attributi/metodi (interesse, applica_interesse).

  • Polimorfismo: possiamo trattare ContoBancario e ContoRisparmio in modo simile per operazioni comuni.


7. Test rapido

  1. Cos’è un oggetto?
    Risposta: istanza di una classe, con attributi e metodi.

  2. Cos’è un metodo?
    Risposta: funzione definita all’interno di una classe che opera sugli attributi dell’oggetto.

  3. Differenza tra attributo di istanza e di classe?
    Risposta: Istanza → specifico per ogni oggetto; Classe → condiviso da tutti gli oggetti.

  4. Cosa permette l’ereditarietà?
    Risposta: creare classi figlie che ereditano attributi e metodi di una classe genitore.

  5. Cos’è il polimorfismo?
    Risposta: oggetti di classi diverse rispondono allo stesso metodo in modi differenti.


8. Attività pratica

  • Creare una classe Veicolo con metodi accelera e frena.

  • Creare sottoclassi Auto e Bicicletta, implementando metodi specifici.

  • Simulare il movimento e stampare lo stato di ogni veicolo.

  • Bonus: aggiungere attributi come carburante o cambio e gestirli con metodi dedicati.


Nessun commento:

Posta un commento

Corso Fondamenti di Informatica e Reti: 4 Architettura del computer

  ARCHITETTURA DEL COMPUTER come funziona davvero una macchina Capire un computer non significa solo saperlo accendere o aprire file: die...