Python descriptoren maken het mogelijk te controleren wat er gebeurt bij het lezen, wijzigen of verwijderen van een objectattribuut. Een tutorial legt gedetailleerd uit hoe je ze kunt gebruiken om drie soorten gecontroleerde attributen te bouwen: gevalideerde, berekende en op aanvraag geladen. Het illustreert de aanpak met een fictief voorbeeld van een toeristische applicatie voor Japan.
Een descriptor is een klasse die methoden implementeert zoals __get__, __set__ of __delete__, die het gedrag van een attribuut definiëren. Niet alle zijn verplicht. De methode __set_name__, geïntroduceerd in Python 3.6, geeft de descriptor de naam van het attribuut waaraan het is gekoppeld, waardoor de waarde kan worden opgeslagen in de __dict__ van het bovenliggende object zonder naamconflicten. Volgens de auteur voorkomt deze aanpak dat de code wordt verzwaard met @property-decorators, getters en setters.
Gevalideerde, berekende of luie attributen
Het eerste voorbeeld, genaamd ValidatedRating, controleert of een beoordeling een getal (geheel of decimaal) is tussen een minimum- en maximumwaarde, standaard ingesteld op 1.0 en 5.0. Bij een niet-numerieke waarde wordt een TypeError opgegooid; als de waarde buiten het bereik valt, een ValueError.
Het tweede, ComputedUSDPrice, dient om een in Japanse yen (JPY) opgeslagen prijs in Amerikaanse dollars weer te geven. Het berekent de conversie on-the-fly, gebaseerd op een wisselkoers van 0.0067, in de code aangegeven als een benadering. Omdat het attribuut alleen-lezen is, leidt elke schrijfpoging tot een AttributeError.
Het derde, LazyItinerary, is van toepassing op gegevens die kostbaar zijn om te produceren, zoals het lezen van een groot JSON-bestand of het bevragen van een database met Shinkansen-dienstregelingen, de Japanse hogesnelheidstreinen. De descriptor berekent de waarde alleen bij de eerste raadpleging, plaatst deze in de __dict__ van de instantie en trekt zich dan terug. Latere raadplegingen lezen deze waarde direct. In het voorbeeld is een simulatie van een latentie van één seconde opgenomen.
In de praktijk gebracht met een bezoek aan Kyoto
Deze drie descriptoren zijn samengebracht in een klasse JapanTour. Tijdens de initialisatie met een bestemming ‘Kyoto’, een prijs van 45000 JPY en een beoordeling van 4.8, wordt de validatie onmiddellijk geactiveerd. Wanneer de auteur vervolgens probeert de waarde 6.0 aan de beoordeling toe te kennen, wordt de uitzondering onderschept en verschijnt het bericht ‘rating must be between 1.0 and 5.0.’.
De eerste raadpleging van de reisroute toont het simulatiebericht van de query, gevolgd door een driedaags programma: aankomst en inchecken in Kyoto, een rondleiding door tempels en street food proeven, en vervolgens vertrek per Shinkansen. Bij de tweede raadpleging verschijnt het bericht niet meer: de waarde wordt direct vanuit de instantie gelezen.
Het artikel concludeert dat deze drie soorten descriptoren de robuustheid van klasse-attributen versterken, door respectievelijk de gegevensintegriteit, de berekening van afgeleide waarden en het beheer van kostbare operaties te waarborgen.





