Introduzione alla Programmazione a Oggetti in Python: classi, oggetti e costruttori

by theArchitect
SHARE
Introduzione alla Programmazione a Oggetti in Python: classi, oggetti e costruttori
© Guida-HTML5.it

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:

  • nome rappresenta il nome del prodotto
  • prezzo rappresenta il costo unitario
  • quantita rappresenta 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 prodotto
  • valore_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

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.

SHARE