Metodi avanzati e gestione degli attributi
- #python
- #programmazione
- #oop
- #classi
- #metodi
- #property
In questa lezione
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")
Nota
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:
| Tipo | Decoratore | Primo parametro | Accesso a… |
|---|---|---|---|
| Metodo di istanza | — | self | Attributi e metodi dell’oggetto |
| Metodo di classe | @classmethod | cls | Attributi e metodi della classe |
| Metodo statico | @staticmethod | — | Nessuno, è 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))
Suggerimento
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
Nota
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,autoreeprezzo; - 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
Mettiti alla prova
0/10 risposte
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?