Introduzione
La programmazione a oggetti, spesso abbreviata in OOP (Object-Oriented Programming), è uno dei paradigmi più usati in Python per organizzare il codice in modo chiaro, modulare e riutilizzabile. Invece di pensare solo a funzioni e dati separati, con l’OOP si modellano oggetti del mondo reale o del dominio del problema: un utente, un prodotto, un ordine, un conto bancario, un sensore, e così via.
In questo tutorial ci concentriamo su un sotto-argomento molto pratico e fondamentale: come definire classi e costruire oggetti usando il costruttore __init__. È un passaggio essenziale per chi vuole iniziare davvero a usare l’OOP in Python in modo corretto, perché permette di creare oggetti già inizializzati con i dati necessari.
Vedremo come una classe rappresenta un “modello”, come un oggetto è un’istanza concreta di quel modello e come il costruttore aiuta a rendere l’uso delle classi semplice e sicuro. Useremo un esempio realistico: la gestione di un piccolo inventario di prodotti.
Codice completo
class Prodotto:
def __init__(self, nome, prezzo, quantita):
# Attributi dell´oggetto
self.nome = nome
self.prezzo = prezzo
self.quantita = quantita
def descrizione(self):
return f"{self.nome} - €{self.prezzo:.2f} - disponibilità: {self.quantita}"
def valore_totale(self):
return self.prezzo * self.quantita
def vendi(self, pezzi):
if pezzi <= 0:
print("La quantità da vendere deve essere positiva.")
return
if pezzi > self.quantita:
print(f"Non ci sono abbastanza pezzi di {self.nome}.")
return
self.quantita -= pezzi
print(f"Venduti {pezzi} pezzi di {self.nome}. Rimasti: {self.quantita}")
# Creazione di alcuni oggetti
prodotto1 = Prodotto("Tastiera meccanica", 89.90, 15)
prodotto2 = Prodotto("Mouse wireless", 29.99, 30)
# Uso dei metodi dell´oggetto
print(prodotto1.descrizione())
print(prodotto2.descrizione())
print("Valore totale prodotto1:", prodotto1.valore_totale())
print("Valore totale prodotto2:", prodotto2.valore_totale())
prodotto1.vendi(3)
prodotto2.vendi(40)
print("Dopo la vendita:")
print(prodotto1.descrizione())
print(prodotto2.descrizione()) Spiegazione
Nel codice sopra abbiamo definito una classe chiamata Prodotto. Una classe è come uno stampo: descrive quali dati e comportamenti avranno gli oggetti creati a partire da essa.
1. La classe
La riga class Prodotto: introduce una nuova classe. Il nome della classe, per convenzione, in Python si scrive con la prima lettera maiuscola e in stile PascalCase.
2. Il costruttore __init__
Il metodo __init__ viene chiamato automaticamente quando creiamo un nuovo oggetto. Serve per inizializzare gli attributi dell’istanza.
Nel nostro esempio:
nomerappresenta il nome del prodottoprezzorappresenta il costo unitarioquantitarappresenta il numero di pezzi disponibili
La parola chiave self indica l’oggetto corrente. È il riferimento all’istanza su cui stiamo lavorando. In pratica, ogni volta che creiamo un prodotto, Python assegna quei valori a quell’oggetto specifico.
3. Gli attributi di istanza
Le righe self.nome = nome, self.prezzo = prezzo e self.quantita = quantita creano attributi associati a ciascun oggetto. Questo significa che ogni prodotto avrà i propri dati indipendenti.
Per esempio, prodotto1 e prodotto2 sono due oggetti distinti, con valori diversi.
4. I metodi dell’oggetto
Abbiamo definito tre metodi:
descrizione(): restituisce una stringa leggibile con i dati principali del prodottovalore_totale(): calcola il valore complessivo dello stock, moltiplicando prezzo e quantitàvendi(pezzi): aggiorna la quantità disponibile dopo una vendita
Questi metodi mostrano un aspetto importante dell’OOP: non solo si memorizzano dati, ma si definiscono anche le operazioni che hanno senso per quei dati.
5. Creazione degli oggetti
Quando scriviamo:
prodotto1 = Prodotto("Tastiera meccanica", 89.90, 15) stiamo creando un’istanza della classe Prodotto. Python chiama automaticamente il costruttore __init__ e passa i valori indicati.
Il risultato è un oggetto pronto all’uso, senza dover assegnare manualmente ogni attributo dopo la creazione.
6. Controlli interni nei metodi
Nel metodo vendi abbiamo inserito due controlli utili:
- la quantità venduta deve essere positiva
- non si possono vendere più pezzi di quelli disponibili
Questa è una buona abitudine: una classe dovrebbe proteggere i propri dati da stati incoerenti o errori logici.
Best practice
Quando inizi a usare la programmazione a oggetti in Python, alcune buone pratiche ti aiutano a scrivere codice più leggibile e robusto.
- Usa nomi chiari per classi e attributi: una classe dovrebbe rappresentare bene il concetto che modella, ad esempio
Prodotto,Cliente,Ordine. - Inizializza sempre gli attributi nel costruttore: evita di creare oggetti “parziali” o con dati mancanti se non è davvero necessario.
- Evita logica troppo complessa nel costruttore:
__init__dovrebbe preparare l’oggetto, non fare calcoli o operazioni pesanti. - Usa i metodi per le operazioni significative: se un oggetto deve vendere, aggiornare, calcolare o validare, incapsula queste azioni in metodi dedicati.
- Valida i dati: controlla i valori in ingresso quando ha senso, ad esempio prezzi non negativi o quantità coerenti.
- Non accedere direttamente agli attributi senza motivo: in progetti più grandi, è spesso meglio passare da metodi dedicati che gestiscono i cambiamenti in modo controllato.
Un altro consiglio importante è quello di mantenere le classi piccole e focalizzate. Se una classe inizia a fare troppe cose, probabilmente è il momento di dividerla in componenti più specializzate.
Riepilogo
La programmazione a oggetti in Python parte da tre elementi fondamentali:
- classe: il modello
- oggetto: l’istanza concreta
- costruttore
__init__: il metodo che inizializza l’oggetto
Nel nostro esempio abbiamo visto come creare una classe Prodotto, inizializzare i suoi attributi e definire comportamenti utili come descrizione, calcolo del valore totale e gestione delle vendite. Questo approccio rende il codice più organizzato e vicino al problema reale che stiamo cercando di risolvere.
Se stai iniziando con l’OOP, il consiglio migliore è esercitarti con oggetti semplici e familiari: libri, utenti, carrelli, prenotazioni, studenti. Più l’esempio è concreto, più sarà facile capire come progettare classi efficaci.
Approfondisci con risorse ufficiali
- Documentazione ufficiale Python sulle classi: https://docs.python.org/3/tutorial/classes.html
- Documentazione ufficiale Python su data model e oggetti: https://docs.python.org/3/reference/datamodel.html
- Guida ufficiale Python al linguaggio: https://docs.python.org/3/tutorial/
Studiare la documentazione ufficiale è il modo migliore per consolidare le basi e imparare a usare Python in modo professionale, con una visione corretta del comportamento delle classi e degli oggetti.
