Les descripteurs de Python permettent de contrôler ce qui se passe lorsqu’on lit, modifie ou supprime un attribut d’objet. Un tutoriel détaille comment s’en servir pour construire trois types d’attributs contrôlés : validés, calculés et chargés à la demande. Il illustre la démarche par un exemple fictif d’application de tourisme au Japon.
Un descripteur est une classe qui implémente des méthodes telles que __get__, __set__ ou __delete__, qui définissent le comportement d’un attribut. Toutes ne sont pas obligatoires. La méthode __set_name__, introduite avec Python 3.6, indique au descripteur le nom de l’attribut auquel il est associé, ce qui permet de stocker la valeur dans le __dict__ de l’objet parent sans collision de noms. Selon l’auteur, cette approche évite d’alourdir le code avec des décorateurs @property, des getters et des setters.
Des attributs validés, calculés ou paresseux
Le premier exemple, nommé ValidatedRating, vérifie qu’une note est un nombre (entier ou décimal) compris entre une valeur minimale et une valeur maximale, fixées par défaut à 1.0 et 5.0. En cas de valeur non numérique, il lève une TypeError ; si la valeur est hors plage, une ValueError.
Le deuxième, ComputedUSDPrice, sert à afficher en dollars américains un prix stocké en yens japonais (JPY). Il calcule la conversion à la volée, à partir d’un taux de change de 0.0067, indiqué dans le code comme une approximation. L’attribut étant en lecture seule, toute tentative d’écriture déclenche une AttributeError.
Le troisième, LazyItinerary, s’applique aux données coûteuses à produire, comme la lecture d’un gros fichier JSON ou l’interrogation d’une base de données d’horaires des Shinkansen, les trains à grande vitesse japonais. Le descripteur ne calcule la valeur qu’à la première consultation, la place dans le __dict__ de l’instance, puis se retire. Les consultations suivantes lisent directement cette valeur. Dans l’exemple, une simulation de latence d’une seconde est incluse.
Mise en pratique avec une visite de Kyoto
Ces trois descripteurs sont réunis dans une classe JapanTour. Lors de l’initialisation avec une destination « Kyoto », un prix de 45000 JPY et une note de 4.8, la validation est déclenchée immédiatement. Lorsque l’auteur tente ensuite d’affecter la valeur 6.0 à la note, l’exception est interceptée et le message « rating must be between 1.0 and 5.0. » s’affiche.
La première consultation de l’itinéraire affiche le message de simulation de requête, puis trois jours de programme : arrivée et enregistrement à Kyoto, visite guidée de temples et dégustation de street food, puis départ en Shinkansen. À la seconde consultation, le message n’apparaît plus : la valeur est lue directement depuis l’instance.
L’article conclut que ces trois types de descripteurs renforcent la robustesse des attributs de classe, en assurant respectivement l’intégrité des données, le calcul de valeurs dérivées et la gestion des opérations coûteuses.





