De geldige toestand van objecten bewaken · oefening
Beheers wijzigingen met propertysetters
Alles tot nu toe ging in één richting: minder manieren waarop de buitenwereld naar een object kan schrijven. Les 2 weigerde ongeldige aanmaak, les 3 verving toewijzingen door gebeurtenissen en les 5 maakte de score leesbaar maar niet beschrijfbaar.
Soms moet een waarde echt veranderbaar zijn. De duur van een timer kan na een beoordeling worden aangepast. Iemand is simpelweg van gedachten veranderd.
Een property die een waarde accepteert
Een property kan een tweede helft definiëren die wordt uitgevoerd wanneer iemand eraan toewijst:
De lezende helft is @property. De schrijvende helft is @minutes.setter, genoemd naar de property waarbij die hoort. Beide methoden heten minutes: de ene wordt tijdens het lezen uitgevoerd en de andere tijdens het toewijzen. Merk op dat __init__ ook self.minutes = minutes gebruikt, zodat het aanmaken de regel niet kan omzeilen.
Nu wordt een ongeldige toewijzing geweigerd:
timer.minutes = 0
De klasse bekijkt de waarde voordat ze die opslaat. Als de controle een fout opwerpt, vindt de toewijzing niet plaats en blijft de oude geldige waarde behouden.
Wat doet Python wanneer een programma timer.minutes = 5 uitvoert?
Gebruik een setter bewust
Elk attribuut in een property verpakken voegt code toe zonder veiligheid toe te voegen. Gebruik een setter wanneer beide voorwaarden gelden:
aanroepers moeten echt aan dit ene attribuut kunnen toewijzen;
het attribuut heeft een regel die het afdwingen waard is.
Een score die uit geregistreerde antwoorden wordt berekend, voldoet niet aan de eerste voorwaarde en blijft dus alleen-lezen. In de oefening voldoet de aanpasbare puntenwaarde van een vraag aan beide.
De oefening voegt één gerechtvaardigde setter toe en controleert het cruciale foutgeval: een geweigerde toewijzing laat de vorige waarde ongemoeid. De volgende les behandelt een ander probleem: één echte wijziging die meerdere attributen tegelijk moet bijwerken.
Opdracht
Geef points een setter die elke waarde van nul of lager weigert door ValueError op te gooien. Het lezen van question.points moet blijven werken zoals voorheen. Laat de constructor de beginwaarde via dezelfde setter instellen, zodat ongeldige vragen de regel tijdens het aanmaken niet kunnen omzeilen.
Voer het programma uit. De geweigerde toewijzing moet het bijbehorende bericht tonen en de vorige puntenwaarde van de vraag precies laten zoals die was.