👩💻 Oggetti, classi e metodi
introduzione alla programmazione ad oggetti (OOP)
📌 Concetti chiave
🔹 Il paradigma a oggetti
La programmazione a oggetti (OOP, Object-Oriented Programming) è un paradigma che organizza il codice attorno a entità chiamate oggetti.
Un oggetto è un’astrazione del mondo reale che racchiude dati (stato) e comportamenti (azioni) in un’unica unità coerente.
👉 In altre parole, un oggetto può essere visto come una “cosa” autonoma capace di interagire con altre cose.
🔹 Perché la OOP
Rispetto al modello procedurale, in cui i dati e le funzioni sono separati, la OOP presenta diversi vantaggi:
- Organizzazione → il codice è più leggibile e strutturato.
- Riusabilità → le classi possono essere riutilizzate in più progetti.
- Manutenibilità → è più facile aggiornare o correggere una parte del sistema senza stravolgere tutto il resto.
- Astrazione → permette di modellare problemi complessi in modo naturale.
🔹 Procedurale vs OOP
| Paradigma Procedurale |
Paradigma a Oggetti (OOP) |
| Dati e funzioni separati |
Dati e metodi integrati in oggetti |
| Programma come sequenza di istruzioni |
Programma come interazione tra oggetti |
| Riutilizzo limitato |
Elevato riutilizzo grazie a classi e ereditarietà |
🔹 Classi e istanze
- Una classe è un modello, una sorta di “stampo” per creare oggetti.
- Un’istanza è un oggetto concreto creato da una classe.
Esempio:
class Animale:
pass
cane = Animale() # istanza della classe Animale
🔹 Attributi e metodi
- Attributi → variabili che descrivono le caratteristiche di un oggetto.
- Metodi → funzioni definite all’interno della classe, che descrivono i comportamenti dell’oggetto.
Esempio:
class Animale:
def __init__(self, nome, specie, suono):
self.nome = nome # attributo
self.specie = specie # attributo
self.suono = suono # attributo
def faiVerso(self): # metodo
return f"{self.nome} dice {self.suono}"
🧪 Attività pratiche
1️⃣ Classe Animale
Definisci una classe con attributi e metodi, poi crea diverse istanze.
class Animale:
def __init__(self, nome, specie, suono):
self.nome = nome
self.specie = specie
self.suono = suono
def faiVerso(self):
return f"{self.nome} ({self.specie}) dice: {self.suono}"
# istanze
cane = Animale("Fido", "Cane", "bau")
gatto = Animale("Micio", "Gatto", "miao")
mucca = Animale("Bianchina", "Mucca", "muu")
print(cane.faiVerso())
print(gatto.faiVerso())
print(mucca.faiVerso())
2️⃣ Interazione tra oggetti
Facciamo interagire due classi: Animale e Giocattolo.
class Giocattolo:
def __init__(self, nome):
self.nome = nome
def usatoDa(self, animale):
return f"{animale.nome} gioca con {self.nome}"
palla = Giocattolo("palla")
print(palla.usatoDa(cane)) # Fido gioca con palla
3️⃣ Mondo reale
Modelliamo un concetto più vicino alla vita quotidiana: Studente.
class Studente:
def __init__(self, nome, eta, classe):
self.nome = nome
self.eta = eta
self.classe = classe
def studia(self, materia):
return f"{self.nome} sta studiando {materia}"
def sostieneEsame(self, materia):
return f"{self.nome} ha sostenuto l’esame di {materia}"
alunno = Studente("Luca", 20, "3A")
print(alunno.studia("matematica"))
print(alunno.sostieneEsame("fisica"))
Altri esempi possibili:
Libro con titolo, autore, numero di pagine, metodo leggi().
ContoBancario con saldo, metodi deposita(), preleva().
🔍 Riflessione critica
La OOP non è solo una tecnica, ma un modo di pensare.
Modellare un sistema in termini di oggetti significa avvicinare la logica del software a quella del mondo reale. Tuttavia:
- Non sempre è il paradigma migliore (per esempio, nei programmi molto semplici la OOP può risultare eccessiva).
- Richiede disciplina e progettazione: una cattiva modellazione porta a codice complesso e difficile da mantenere.
- È stata rivoluzionaria, ma oggi si combina con altri paradigmi (funzionale, reattivo, declarativo) per rispondere alla complessità crescente del software moderno.
📋 Test di verifica
1. Cosa rappresenta una classe nella OOP?
A) Una funzione specifica
B) Un tipo di dato primitivo
C) Un modello per creare oggetti ✅
2. Quale tra questi è un esempio di attributo?
A)
studia()
B)
nome ✅
C)
return
3. Quale tra queste è una differenza tra OOP e programmazione procedurale?
A) Nella OOP non esistono funzioni
B) La OOP separa dati e comportamenti
C) La OOP racchiude dati e metodi negli oggetti ✅
4. Se creo un oggetto “pippo = Animale('Pippo', 'Pappagallo', 'ciao')”, cosa rappresenta “pippo”?
A) Una classe
B) Un metodo
C) Un’istanza ✅
5. Cosa fa il metodo __init__?
A) È un costruttore, inizializza gli oggetti ✅
B) Elimina una classe
C) Chiude il programma
🔎 Risposte corrette: 1C – 2B – 3C – 4C – 5A
🎯 Obiettivo didattico:
Acquisire i concetti base della programmazione orientata agli oggetti attraverso esempi concreti, simulazioni ed esercizi.
💬 Suggerimento:
Per stimolare la riflessione, chiedi agli studenti di inventare una propria classe originale (es. Videogioco, Pianeta, Ingrediente) e mostrarne attributi e metodi in un disegno o schema.