In deze oefening bouwen we de klasse Tractatie
, die bedoeld is
om bij te houden wie wat betaald heeft tijdens een avondje uit met kennissen en vrienden. Je dient dus
bij te houden voor welk bedrag elk van de deelnemers besteld heeft, en welk bedrag elke deelnemer al
betaald heeft. Bedragen worden via gehele getallen, uitdrukt in eurocent, voorgesteld.
Programmeer in de klasse Tractatie
het volgende:
- een constructor met 2 argumenten, namelijk
- de naam van de gelegenheid voor het avondje uit (type
str
)
- een lijst van strings, die de namen van de deelnemers aan het avondje uit bevat
- de operator "==" levert "True" indien de naam van de gelegenheid en de lijst van deelnemers identiek zijn (m.a.w. ook de volgorde
binnen de lijst dient identiek te zijn). De operator levert "False" in alle andere gevallen.
- een geschikte methode
__repr__()
- de methode
__str__()
levert een string-gedaante van de vorm $$\verb![naam_gelegenheid,deelnemers_gegevens]!$$.
Hierbij stelt $$\verb!deelnemers_gegevens!$$ een lijst van tuples voor. Elk tuple bestaat uit 3 componenten, namelijk:
- de naam van de deelnemer
- het totaalbedrag waarvoor de deelnemer al besteld heeft
- het totaalbedrag dat de deelnemer al afgerekend heeft
De lijst is geordend via de naam van de deelnemers, dezelfde volgorde volgend als opgegeven aan de constructor.
- elk object van de klasse is oproepbaar en de oproep
r(naam)
, met naam
een string, die de naam van een deelnemer voorstelt, levert
een tuple op, bestaande uit 2 componenten, namelijk:
- het totaalbedrag waarvoor de deelnemer al besteld heeft
- het totaalbedrag dat de deelnemer al afgerekend heeft
Indien de opgegeven naam geen deelnemer aan het feestje voorstelt, is het resultaat van de oproep
'?'
- bestelling noteren:de operator "+=" verwacht een tuple bestaande uit 2 componenten als rechteroperand, bestaande uit:
- de naam van een deelnemer (dus een
str
), je mag aannemen dat het om een geldige deelnemer gaat
- een geheel bedrag, dat de waarde van een bestelling door die deelnemer voorstelt
Het effect van deze bewerking is dat een bestelling door deze deelnemer voor de opgegeven waarde geregistreerd wordt.
Hiermee wordt het totaalbedrag waarvoor deze deelnemer al besteld heeft dus aangepast.
- rondje afrekenen: de operator "-=" heeft een string als rechteroperand, namelijk de naam van een
geldige deelnemer. Het effect hiervan is dat deze deelnemer alle nog niet betaalde bestellingen afrekent (en dit
wijzigt dus zijn/haar totaal aan betalingen)
Voorbeeld
t = Tractatie('Feestje', ['Jan', 'An', 'Dirk', 'Sien'])
print(t) # [Feestje,[('Jan', 0, 0), ('An', 0, 0), ('Dirk', 0, 0), ('Sien', 0, 0)]]
u = Tractatie('Feestje',['Jan', 'An', 'Dirk', 'Sien'])
v = Tractatie('Feestje',['Jan', 'An', 'Dirk'])
t == u # True
t == v # False
t == eval(repr(u)) # True
t == eval(repr(v)) # False
t += ('Jan', 220)
t += ('Dirk', 210)
t += ('Jan', 120)
print(t) # [Feestje,[('Jan', 340, 0), ('An', 0, 0), ('Dirk', 210, 0), ('Sien', 0, 0)]]
print(t('Jan')) # (340, 0)
print(t('Pieter')) # ?
t -= 'An'
print(t) # [Feestje,[('Jan', 340, 0), ('An', 0, 550), ('Dirk', 210, 0), ('Sien', 0, 0)]]
t += ('Dirk', 140)
t += ('Sien', 250)
t -= 'Dirk'
print(t) # [Feestje,[('Jan', 340, 0), ('An', 0, 550), ('Dirk', 350, 390), ('Sien', 250, 0)]]