lettura facile

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.




Se qualcosa non ti è chiaro, scrivi la tua domanda nei commenti.




FacebookTwitterLinkedinLinkedin