
Il decoratore @property in Python
In Python @property è un decoratore che ti permette di definire metodi nella classe che si comportano come attributi.
@property
Questo significa che puoi accedere a un metodo come se fosse un attributo semplice, senza dover usare parentesi. È molto utile per due motivi principali:
- Incapsulamento: permette di nascondere e proteggere lo stato di un'istanza.
- Controllo dell'accesso: facilita la validazione o il calcolo automatico di un valore ogni volta che un attributo viene accesso o modificato.
A cosa serve? Utilizzare `@property` ti permette di mantenere l'integrità dei dati, soprattutto quando il valore di un attributo dipende da altri stati o deve essere mantenuto dentro certi limiti.Inoltre, ti permette di modificare l'implementazione interna senza cambiare il modo in cui accedi o modifichi gli attributi dall'esterno.
Vediamo come si usa @property tramite un esempio pratico.
Crea una classe `Circle` che ha un attributo `radius`
class Circle:
def __init__(self, radius):
self._radius = radius
@property
def area(self):
return 3.14159 * self._radius ** 2
Questa classe calcola l'area del cerchio ogni volta che il raggio cambia.
Come puoi notare, nel codice l'attributo è indicato con l'etichetta `_radius` anziche `radius`. Si tratta di una convenzione per indicare che questo attributo è considerato privato e non dovrebbe essere accesso direttamente dall'esterno.
Il decoratore @property prima del metodo `area` ti permette di accedere all'area del cerchio come se fosse un attributo, ma in realtà è un metodo che calcola l'area ogni volta che la richiedi.
Ad esempio, crea un'istanza della classe.
c = Circle(5)
Poi accedi all'attributo `area` dell'istanza
print(c.area)
78.53975
Python ti restituisce il valore dell'area come se fosse un attributo ma in realtà l'ha calcolato in tempo reale usando il valore dell'attributo `area`.
Quindi, anche se tecnicamente `area` è definito come un metodo nella classe Circle, grazie all'uso del decoratore @property, puoi accedervi come se fosse un attributo.