Sostieni AppuntiFacili con una piccola donazione su PayPal

Dona con PayPal
AppuntiFacili
Torna Indietro Segnala errore

Metodi avanzati e gestione degli attributi

✍️ Dennis Turco 🏷️ Informatica 📘 Python
Ultima modifica:
#python#programmazione#oop#classi#metodi#property

1. Introduzione

In questa lezione approfondiamo alcuni aspetti più avanzati della programmazione orientata agli oggetti (OOP) in Python.

Dopo aver visto come creare classi, oggetti e metodi di base, esploreremo:

  • Costruttori alternativi, per creare oggetti da formati diversi (come stringhe);
  • Tipologie di metodi, per capire la differenza tra metodi di istanza, di classe e statici;
  • Proprietà (@property), per controllare l’accesso e la modifica degli attributi.

Questi concetti rendono il codice più flessibile, leggibile e Pythonic.

2. Costruttori alternativi (@classmethod)

Oltre al costruttore classico __init__, una classe può avere costruttori alternativi, utili quando si vogliono creare oggetti da sorgenti di dati diverse.

Per farlo si usa il decoratore @classmethod.

class Persona:
    def __init__(self, nome, eta):
        self.nome = nome
        self.eta = eta

    @classmethod
    def da_stringa(cls, stringa):
        nome, eta = stringa.split(",")
        return cls(nome, int(eta))

p2 = Persona.da_stringa("Marco,40")

INFO

cls rappresenta la classe stessa, e non l’istanza. È utile quando si vogliono creare metodi che generano oggetti in modo personalizzato.

3. Tipologie di Metodi

In Python esistono tre tipi principali di metodi all’interno delle classi:

TipoDecoratorePrimo parametroAccesso a…
Metodo di istanzaselfAttributi e metodi dell’oggetto
Metodo di classe@classmethodclsAttributi e metodi della classe
Metodo statico@staticmethodNessuno, è indipendente

Esempio:

class Calcolatrice:
    @classmethod
    def info(cls):
        print("Classe per calcoli matematici.")

    @staticmethod
    def somma(a, b):
        return a + b

Calcolatrice.info()
print(Calcolatrice.somma(5, 3))

TIP

I metodi statici sono utili per funzioni “utility” che hanno senso all’interno di una classe, ma non dipendono dallo stato di essa.

4. Proprietà (@property)

Le property permettono di gestire l’accesso agli attributi in modo controllato, mantenendo una sintassi semplice come se si accedesse a un campo pubblico.

Sono particolarmente utili per validare o filtrare i dati durante la lettura o la scrittura.

class Persona:
    def __init__(self, nome, eta):
        self._nome = nome
        self._eta = eta

    @property
    def eta(self):
        return self._eta

    @eta.setter
    def eta(self, valore):
        if valore < 0:
            print("L'età non può essere negativa!")
        else:
            self._eta = valore

Uso:

p = Persona("Luca", 25)
print(p.eta)   # usa il getter
p.eta = -3     # usa il setter → messaggio di errore

INFO

Le property rendono il codice più robusto e permettono di introdurre logica di controllo senza cambiare la sintassi di accesso agli attributi.

5. Esercizi

5.1 Esercizio - Costruttore alternativo

Creare una classe Libro con:

  • attributi titolo, autore e prezzo;
  • un costruttore alternativo da_stringa("titolo;autore;prezzo").

5.2 Esercizio - Property

Creare una classe Studente con un attributo voto e una property che:

  • permette di leggere il voto;
  • impedisce di impostare valori minori di 0 o maggiori di 10.

6. Quiz a risposta multipla

1) Qual è la funzione principale di un metodo con decoratore @classmethod?

2) Qual è il primo parametro che riceve un metodo di classe?

3) In quale caso è utile un costruttore alternativo?

4) A cosa serve il decoratore @staticmethod?

5) Qual è la differenza tra un metodo statico e uno di classe?

6) Cosa consente di fare il decoratore @property?

7) Cosa accade se in una property setter si tenta di assegnare un valore non valido?

8) Qual è il vantaggio principale nell'usare @property?

9) Quale dei seguenti è un esempio corretto di costruttore alternativo?

10) In quale caso si userebbe un metodo statico?

Prenota una lezione