Sprint 7 ยท Methodes & self  ยท  US4: Beslissende methodes

Als developer, wil ik dat een methode zelf ongeldige aanroepen weigert en vragen kan beantwoorden met True of False, zodat de data van een object nooit in een onmogelijke toestand komt.

Taak 2: Een vraag die je in een if gebruikt

Niet elke methode verandert iets. Sommige beantwoorden een vraag. Je leert query-methodes schrijven die True of False teruggeven en gebruikt ze in een if.

Een query-methode: een vraag met ja of nee

Soms wil je niets veranderen, maar alleen iets weten. Dan schrijf je een query: een methode die een vraag beantwoordt met True of False.

class Tank:
    def __init__(self, capacity):
        self.capacity = capacity
        self.level = 0

    def fill(self, amount):
        if not self.can_fit(amount):
            return False
        self.level += amount
        return True

    def is_empty(self):
        return self.level == 0

    def is_full(self):
        return self.level == self.capacity

    def can_fit(self, amount):
        return self.level + amount <= self.capacity

Je gebruikt zo'n vraag direct in een if:

if tank.can_fit(30):
    tank.fill(30)
else:
    print("Tank is too full")
Een query verandert niets. Je mag hem zo vaak aanroepen als je wilt. Het object blijft precies hetzelfde.

Zie de vraag beantwoorden

>>> Oefenomgeving: Python REPL Simulator

Stel de tank vragen en kijk of hij verandert.

  1. tank = Tank(100)
  2. tank.is_empty() โ€” leeg of niet?
  3. tank.fill(100) โ€” vul hem helemaal.
  4. tank.is_full()
  5. tank.can_fit(1) โ€” kan er nog iets bij?
  6. tank.is_empty() โ€” en nu?
  7. tank.level โ€” veranderden de vragen iets aan het level?
Python 3.11 REPL Simulator ยท typ een commando en druk op Enter. # class Tank: # fill(amount) geeft False als het niet past # is_empty() level == 0 # is_full() level == capacity # can_fit(n) level + n <= capacity
>>> 
๐Ÿงฉ

Jouw opdracht: can_afford() en is_empty() op BankAccount

Je bankrekening uit taak 1 leert vragen beantwoorden. Daarmee kan een script eerst vragen en dan pas betalen.

  1. Neem je BankAccount uit taak 1 over.
  2. Voeg can_afford(self, amount) toe. De methode geeft True als het saldo minstens amount is, anders False. Hij verandert niets.
  3. Voeg is_empty(self) toe. De methode geeft True als het saldo precies 0 is.
  4. Schrijf een stukje script met een lijst prijzen [30, 80]. Kijk per prijs met can_afford of er genoeg is. Is dat zo, betaal dan met withdraw en print "Paid". Anders print je "Not enough money".
  5. Print het saldo vรณรณr en na een aanroep van can_afford en laat zien dat het gelijk blijft.

Acceptatiecriteria

  • BankAccount("Sam", 40).can_afford(50) geeft False; met prijs 30 geeft het True.
  • is_empty() geeft alleen True bij een saldo van 0.
  • Beide queries geven echte bool-waarden terug (True/False), geen tekst.
  • Het script gebruikt de query in een if, en het saldo blijft gelijk na een query.