
Il metodo costruttore in una classe Python
Il metodo costruttore è un metodo speciale eseguito automaticamente ogni volta che viene creata una nuova istanza della classe. Il suo obiettivo principale è inizializzare gli attributi della nuova istanza. In Python, il metodo costruttore si chiama `__init__`. Ecco la sintassi di base:
class NomeClasse:
def __init__(self, parametro1, parametro2):
self.attributo1 = parametro1
self.attributo2 = parametro2
Gli argomenti tra le parentesi tonde dopo l'etichetta __init__ sono:
- `self` rappresenta l'istanza corrente della classe e viene usato per accedere agli attributi e ai metodi della classe
- la lista dei parametri passati al metodo costruttore
Il metodo costruttore __init__ è di fondamentale importanza perché ti consente di inizializzare gli attributi di un'istanza al momento della creazione ed eseguire eventuali altre operazioni di inizializzazione come la validazione dei dati, svolgere dei calcoli o indicare dei valori di default.
Il metodo costruttore viene eseguito automaticamente alla creazione di un oggetto e non deve essere chiamato manualmente. Tuttavia, ricorda che questo avviene solo una volta per oggetto, al momento della sua creazione. Per garantire la coerenza e l'integrità dei dati, ti consiglio di implementare dei controlli simili anche nei metodi getter o in altri metodi che modificano gli attributi dell'oggetto dopo la sua inizializzazione.
Esempio
Ad esempio, supponiamo di voler creare una classe `Automobile` che necessita di attributi come marca, modello e anno di produzione.
Ecco come potremmo scrivere il costruttore:
class Automobile:
def __init__(self, marca, modello, anno):
self.marca = marca
self.modello = modello
self.anno = anno
Nel metodo costruttore __init__ sono indicati i tre attributi: marca, modello, anno.
In questo modo quando crei un'istanza della classe Automobile è obbligatorio indicare anche i valori di ogni attributo.
mia_auto = Automobile("Tesla", "Model S", 2022)
Se provi a creare un'istanza senza indicare tutti gli attributi, Python non crea l'oggetto e restituisce un messaggio di errore.
mia_auto2 = Automobile()
errore
Una volta generata l'istanza, puoi accedere al valore di ogni singolo attributo dell'oggetto.
print(mia_auto.marca)
TypeError: Automobile.__init__() missing 3 required positional arguments: 'marca', 'modello', and 'anno'
Al di là di questo, il metodo costruttore ti offre molti altri vantaggi.
I valori predefiniti
Ad esempio, puoi definire dei valori predefiniti per gli attributi del costruttore, che verranno utilizzati se non vengono forniti dei valori specifici.
class Automobile:
def __init__(self, marca, modello, anno=2024):
self.marca = marca
self.modello = modello
self.anno = anno
In questo caso negli argomenti è presente l'attributo e il valore "anno=2024".
Questo vuole dire che se non viene specificato l'anno, Python crea comunque l'istanza assegnandogli il valore di default 2024 all'attributo 'anno'.
Ad esempio, crea un'istanza senza specificare l'anno.
mia_auto = Automobile("Tesla", "Model S")
Python crea l'istanza senza sollevare alcun errore.
Se ora interroghi l'attributo "anno", Python accede al valore dell'oggetto e ti restituisce 2024.
print(mia_auto.anno)
2024
La validazione dei dati
Un altro vantaggio del metodo costruttore è la validazione dei dati.
È comune utilizzare il costruttore per eseguire controlli e validazioni sui dati forniti.
Ad esempio, in questa classe abbiamo aggiunto un controllo sull'anno.
class Automobile:
def __init__(self, marca, modello, anno):
if anno < 1990 or anno > 2024:
raise ValueError("Anno deve essere compreso tra 1990 e 2023")
self.marca = marca
self.modello = modello
self.anno = anno
In questo caso se l'anno è un valore inferiore a 1990 o superiore a 2024, Python solleva un'eccezione e non crea l'istanza.
Ad esempio, crea un oggetto indicando 2025 come anno.
mia_auto = Automobile("Tesla", "Model S", 2025)
ValueError: Anno deve essere compreso tra 1990 e 2023
In questo modo puoi controllare se i dati immessi nell'istanza sono corretti oppure no.
Svolgere dei calcoli in fase di inizializzazione
Oltre agli attributi, nel metodo costuttore puoi anche svolgere dei calcoli o chiamare altri metodi della classe per aggiungere funzionalità.
Ad esempio, immaginiamo di avere una classe 'Rettangolo' che rappresenta la figura geometrica.
class Rettangolo:
def __init__(self, larghezza, altezza):
self.larghezza = larghezza
self.altezza = altezza
self.area = self.calcola_area() # Calcolo dell'area nel costruttore
def calcola_area(self):
return self.larghezza * self.altezza
Nell'esempio sopra, il metodo costruttore __init__ inizializza i valori di larghezza e altezza, poi chiama il metodo calcola_area che esegue il calcolo dell'area e assegna il risultato all'attributo area.
Questo ti permette di avere l'area già disponibile come un attributo dell'oggetto subito dopo la sua creazione.
Ad esempio, crea un'istanza della classe Rettangolo
mio_rettangolo = Rettangolo(4, 5)
Ora stampa il valore dell'area calcolata nel costruttore
print(mio_rettangolo.area)
20
Quindi, il metodo costruttore può essere utilizzato per eseguire calcoli immediati che sono essenziali per l'oggetto creato.
E' un approccio particolarmente vantaggioso quando l'informazione deriva da altri attributi, in quanto semplifica la creazione dell'istanza riducendo il numero di parametri da fornire.
In quest'ultimo esempio il calcolo dell'area è separato dal costruttore, viene svolto tramite un metodo dedicato (calcola_area). Questo è utile per mantenere il codice organizzato e riusabile. Tuttavia non è obbligatorio. Puoi anche aggiungere il calcolo direttamente all'interno del costruttore. Il risultato finale è lo stesso.
class Rettangolo:
def __init__(self, larghezza, altezza):
self.larghezza = larghezza
self.altezza = altezza
self.area = self.larghezza * self.altezza # Calcolo dell'area nel costruttore
In conclusione, questi esempi dimostrano come il metodo costruttore sia uno strumento essenziale per la creazione e la gestione di oggetti in Python, perché rende la programmazione chiara e strutturata.