Sostieni AppuntiFacili con una piccola donazione su PayPal
Dona con PayPalIn 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:
@property), per controllare l’accesso e la modifica degli attributi.Questi concetti rendono il codice più flessibile, leggibile e Pythonic.
@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.
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))
TIP
I metodi statici sono utili per funzioni “utility” che hanno senso all’interno di una classe, ma non dipendono dallo stato di essa.
@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.
Creare una classe Libro con:
titolo, autore e prezzo;da_stringa("titolo;autore;prezzo").Creare una classe Studente con un attributo voto e una property che:
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?