Los descriptores de Python permiten controlar lo que sucede cuando se lee, modifica o elimina un atributo de un objeto. Un tutorial detalla cómo usarlos para construir tres tipos de atributos controlados: validados, calculados y cargados bajo demanda. Ilustra el procedimiento con un ejemplo ficticio de una aplicación de turismo en Japón.
Un descriptor es una clase que implementa métodos como __get__, __set__ o __delete__, que definen el comportamiento de un atributo. No todos son obligatorios. El método __set_name__, introducido en Python 3.6, indica al descriptor el nombre del atributo al que está asociado, lo que permite almacenar el valor en el __dict__ del objeto padre sin colisión de nombres. Según el autor, este enfoque evita sobrecargar el código con decoradores @property, getters y setters.
Atributos validados, calculados o perezosos
El primer ejemplo, llamado ValidatedRating, verifica que una calificación sea un número (entero o decimal) comprendido entre un valor mínimo y uno máximo, establecidos por defecto en 1.0 y 5.0. En caso de un valor no numérico, lanza un TypeError; si el valor está fuera del rango, un ValueError.
El segundo, ComputedUSDPrice, sirve para mostrar en dólares estadounidenses un precio almacenado en yenes japoneses (JPY). Calcula la conversión sobre la marcha, a partir de un tipo de cambio de 0.0067, indicado en el código como una aproximación. Al ser un atributo de solo lectura, cualquier intento de escritura desencadena un AttributeError.
El tercero, LazyItinerary, se aplica a datos costosos de producir, como la lectura de un archivo JSON grande o la consulta a una base de datos de horarios de los Shinkansen, los trenes de alta velocidad japoneses. El descriptor solo calcula el valor en la primera consulta, lo coloca en el __dict__ de la instancia y luego se retira. Las consultas siguientes leen directamente este valor. En el ejemplo, se incluye una simulación de latencia de un segundo.
Puesta en práctica con una visita a Kioto
Estos tres descriptores se reúnen en una clase JapanTour. Durante la inicialización con un destino «Kyoto», un precio de 45000 JPY y una calificación de 4.8, la validación se activa inmediatamente. Cuando el autor intenta luego asignar el valor 6.0 a la calificación, se intercepta la excepción y se muestra el mensaje «rating must be between 1.0 and 5.0.».
La primera consulta del itinerario muestra el mensaje de simulación de solicitud, luego tres días de programa: llegada y registro en Kioto, visita guiada a templos y degustación de comida callejera, y salida en Shinkansen. En la segunda consulta, el mensaje ya no aparece: el valor se lee directamente desde la instancia.
El artículo concluye que estos tres tipos de descriptores refuerzan la robustez de los atributos de clase, asegurando respectivamente la integridad de los datos, el cálculo de valores derivados y la gestión de operaciones costosas.





