I descrittori di Python permettono di controllare ciò che accade quando si legge, modifica o elimina un attributo di un oggetto. Un tutorial dettaglia come usarli per costruire tre tipi di attributi controllati: validati, calcolati e caricati su richiesta. Illustra la procedura con un esempio fittizio di un’applicazione turistica per il Giappone.
Un descrittore è una classe che implementa metodi come __get__, __set__ o __delete__, che definiscono il comportamento di un attributo. Non tutti sono obbligatori. Il metodo __set_name__, introdotto con Python 3.6, indica al descrittore il nome dell’attributo a cui è associato, permettendo di memorizzare il valore nel __dict__ dell’oggetto padre senza collisioni di nomi. Secondo l’autore, questo approccio evita di appesantire il codice con decoratori @property, getter e setter.
Attributi validati, calcolati o pigri
Il primo esempio, chiamato ValidatedRating, verifica che un punteggio sia un numero (intero o decimale) compreso tra un valore minimo e uno massimo, fissati di default a 1.0 e 5.0. In caso di valore non numerico, solleva un TypeError; se il valore è fuori intervallo, un ValueError.
Il secondo, ComputedUSDPrice, serve a visualizzare in dollari statunitensi un prezzo memorizzato in yen giapponesi (JPY). Calcola la conversione al volo, utilizzando un tasso di cambio di 0.0067, indicato nel codice come un’approssimazione. L’attributo essendo in sola lettura, ogni tentativo di scrittura scatena un AttributeError.
Il terzo, LazyItinerary, si applica a dati costosi da produrre, come la lettura di un file JSON di grandi dimensioni o l’interrogazione di un database degli orari degli Shinkansen, i treni ad alta velocità giapponesi. Il descrittore calcola il valore solo alla prima consultazione, lo inserisce nel __dict__ dell’istanza e poi si ritira. Le consultazioni successive leggono direttamente questo valore. Nell’esempio, è inclusa una simulazione di latenza di un secondo.
Messa in pratica con una visita a Kyoto
Questi tre descrittori sono riuniti in una classe JapanTour. Durante l’inizializzazione con una destinazione «Kyoto», un prezzo di 45000 JPY e un punteggio di 4.8, la validazione viene attivata immediatamente. Quando l’autore tenta poi di assegnare il valore 6.0 al punteggio, l’eccezione viene intercettata e viene visualizzato il messaggio «rating must be between 1.0 and 5.0.».
La prima consultazione dell’itinerario mostra il messaggio di simulazione della richiesta, poi tre giorni di programma: arrivo e check-in a Kyoto, visita guidata dei templi e degustazione di street food, quindi partenza in Shinkansen. Alla seconda consultazione, il messaggio non appare più: il valore viene letto direttamente dall’istanza.
L’articolo conclude che questi tre tipi di descrittori rafforzano la robustezza degli attributi di classe, garantendo rispettivamente l’integrità dei dati, il calcolo di valori derivati e la gestione delle operazioni costose.





