lettura facile

Il metodo __init__ delle classi in in Python

In Python il metodo `__init__` si trova spesso nelle definizioni delle classi. Si tratta di quello che chiamiamo un "metodo costruttore", e il suo compito principale è quello di inizializzare gli oggetti creati dalla classe.

Quando crei un nuovo oggetto (un'istanza di una classe), Python chiama automaticamente il metodo `__init__` per quell'oggetto, permettendoti di impostare gli stati iniziali, come le proprietà dell'oggetto. È un po' come preparare tutto il necessario prima di iniziare una ricetta in cucina. Puoi pensarlo come il primo passo per 'dar vita' al tuo oggetto in Python.

Il metodo __init__() è anche detto "inizializzatore" ed è presente nella classe object, quindi viene ereditato da tutte le classi e può essere personalizzato tramite l'overriding.

Il primo parametro del metodo __init__ è sempre 'self' che rappresenta l'istanza dell'oggetto. Inoltre, non restituisce alcun valore di ritorno. Quindi, la presenza di return all'interno del metodo genera un errore.

Un esempio pratico

Ecco un esempio pratico per rendere tutto questo più chiaro:

Immagina di avere una classe chiamata `Automobile`.

Un'automobile ha diverse caratteristiche, come marca, modello e colore. Puoi usare il costruttore `__init__` per definire queste caratteristiche quando crei un'automobile.

class Automobile:
    def __init__(self, marca, modello, colore):
       self.marca = marca
       self.modello = modello
       self.colore = colore

In questa esempio definisci una classe `Automobile` con il metodo `__init__` che accetta tre parametri: `marca`, `modello` e `colore`.

Il metodo `__init__` riceve i valori e li assegna agli attributi dell'oggetto: `self.marca`, `self.modello`, e `self.colore`. Dove `self` si riferisce all'oggetto specifico che stiamo creando.

Ora, quando crei un oggetto con questa classe, Python si aspetta che gli passi tutte le informazioni necessarie per completare l'inizializzazione dell'oggetto, in caso contrario il codice va in errore.

In questo caso devi indicare la marca, il modello e il colore dell'automobile.

mia_auto = Automobile("Tesla", "Model S", "nero")

Una volta creato l'oggetto puoi utilizzarlo come vuoi.

Ad esempio, puoi accedere ai suoi attributi.

print(f"La mia auto è una {mia_auto.marca} {mia_auto.modello} di colore {mia_auto.colore}.")

La mia auto è una Tesla Model S di colore nero.

Cosa accade se l'istanza non contiene tutti i parametri richiesti dal metodo costruttore?

Quando crei un oggetto senza indicare tutti i valori richiesti dal metodo costruttore, il codice Python solleva un'eccezione e mostra un messaggio di errore.

Ad esempio, se provi a creare un oggetto dalla classe `Automobile` senza indicare il `colore`, viene mostrato un TypeError.

mia_auto2 = Automobile("Tesla", "Model S")

TypeError: Automobile.__init__() missing 1 required positional argument: 'colore'

Questo accade perché ogni volta che crei un oggetto di questa classe, `__init__` viene chiamato automaticamente.

L'overriding di classi predefinite

L'overriding del metodo __init__ ti permette anche di creare nuovi tipi e strutture di dati a partire da classi predefinite.

Ad esempio,  puoi modificare la classe `dict` per creare un nuovo tipo di dizionario personalizzato in Python.

La classe `dict` è una delle classi predefinite in Python che rappresenta un dizionario, ossia una struttura dati che mappa chiavi a valori.

Supponiamo di voler creare una sottoclasse di `dict` che aggiunge una funzionalità extra durante l'inizializzazione, ad esempio, vogliamo che il dizionario venga inizializzato automaticamente con una coppia chiave-valore predefinita ogni volta che viene istanziato.

Ecco un esempio di come potresti fare l'overriding del metodo `__init__()` in una sottoclasse di `dict`:

class MyDict(dict):
    def __init__(self, *args, **kwargs):
        # Chiama l'inizializzatore della classe base (dict)
        super().__init__(*args, **kwargs)
        # Aggiunge una coppia chiave-valore predefinita
        self['default_key'] = 'default_value'

In questo codice viene definita una classe MyDict che eredita i metodi e le proprietà dalla classe "dict" di Python e personalizza l'inizializzatore con una funzionalità extra.

Ogni volta che viene istanziato un oggetto della classe MyDict, nel dizionario viene aggiunta automaticamente la chiave "default_key" e il valore "default_value".

Nota che per fare l'override di `__init__()` viene chiamato l'inizializzatore della classe base `dict` usando `super().__init__(*args, **kwargs)`. Questo garantisce che il dizionario venga inizializzato correttamente anche con eventuali argomenti passati tra le parentesi tonde.

Crea un'istanza della classe

my_dict = MyDict(a=1, b=2)

Ora visualizza il contenuto dell'oggetto.

print(my_dict) 

{'a': 1, 'b': 2, 'default_key': 'default_value'}

Oltre ai valori passati come argomento, nel dizionario ci sono anche i valori predefiniti aggiunti automaticamente al momento dell'inizializzazione.

E' un semplice esempio di come si può sovrascrivere il metodo `__init__()` in una classe predefinita di Python per estendere o modificare il comportamento standard.

In conclusione, il metodo `__init__` è essenziale per passare argomenti iniziali a un oggetto.

Ti aiuta a garantire che l'oggetto abbia tutto ciò di cui ha bisogno per funzionare correttamente non appena viene creato.




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




FacebookTwitterLinkedinLinkedin