0%

Dataclasses en waardeobjecten · oefening

Bevries waardeobjecten

Hoofdstuk 7 maakte de invoer voor hashes alleen-lezen met properties. Een dataclass kan dezelfde beslissing rechtstreeks uitdrukken.

Bevries een waarde

Try it

Toewijzing wordt geweigerd:

points.amount = 5

Het attribuut amount kan niet opnieuw worden toegewezen. Het bevat een onveranderbaar geheel getal, dus de waarde die gelijkheid gebruikt blijft stabiel en de gegenereerde hash is veilig:

Try it

Waarom is de gegenereerde hash veilig voor deze bevroren klasse Points?

Entiteiten doen een andere belofte

Een poging bestaat om te veranderen. Houd die veranderbaar. Die vertegenwoordigt ook één gebeurtenis, dus twee overeenkomende pogingen moeten gelijkheid op basis van identiteit behouden:

@dataclass(eq=False)
class QuizAttempt:
    learner: str
    responses: list = field(default_factory=list)

eq=False schakelt gegenereerde waardegelijkheid uit. Gewone gelijkheid en hashing op basis van identiteit blijven behouden.

WaardeEntiteit
VoorbeeldPoints, QuestionQuizAttempt
GelijkheidInhoudIdentiteit
BevrorenMeestalMeestal niet
HashInhoud, als de velden dat ondersteunenIdentiteit

Bevriezen is oppervlakkig: het voorkomt toewijzen aan een attribuut, maar een veranderbare lijst die erin is opgeslagen kan nog steeds veranderen. Een werkelijk onveranderbare waarde hoort zelf onveranderbare waarden te bevatten.

De oefening deelt drie waarden en één entiteit in. Nieuwe versies maken van bevroren waarden is het enige onderwerp van de volgende les.

Opdracht

Bevries wat bevroren hoort te zijn en behoud de identiteit van entiteiten.

Maak van Points, Duration en Question bevroren dataclasses. Ze moeten toewijzing weigeren en in sets of als dictionarysleutels werken.

Behoud hun aanmaakregels in __post_init__: punten zijn positief; minuten van een tijdsduur zijn niet-negatief en seconden liggen van 0 tot en met 59; een vraag heeft een niet-lege vraagtekst, een niet-leeg antwoord en positieve punten.

Laat QuizAttempt veranderbaar en gebruik eq=False, zodat afzonderlijke pogingen op identiteit worden vergeleken. De lijst responses moet per poging onafhankelijk blijven.