Sprint 7 Β· Methodes & self  Β·  US1: State via een eigen methode

Als gamedeveloper, wil ik dat elk spelobject zijn eigen toestand binnen zichzelf bijhoudt en aanpast, zodat een losse functie nooit per ongeluk het verkeerde object of een zwevende variabele raakt.

Taak 2: De methode die zichzelf updatet

De fix voor taak 1: je verplaatst turn_on() naar binnen de class. Nu wordt de actie aangeroepen als lamp1.turn_on() β€” Python stuurt automatisch het juiste object mee als self, en de methode past precies dat object aan.

Van losse functie naar methode van de class

In taak 1 zag je dat een losse functie nooit bij het juiste object kan komen. De oplossing is simpel: zet de functie binnen de class. Dan heet ze een methode.

class Lamp:
    def __init__(self, name):
        self.name  = name
        self.is_on = False      # standaard uit

    def turn_on(self):           # methode β€” let op: self als eerste parameter
        self.is_on = True       # past het attribuut van DIT object aan

    def turn_off(self):
        self.is_on = False

Aanroepen doe je nu zo:

lamp1 = Lamp("living room")
lamp2 = Lamp("bedroom")

lamp1.turn_on()        # Python stuurt lamp1 automatisch mee als self
print(lamp1.is_on)    # True  β€” lamp1 is aan
print(lamp2.is_on)    # False β€” lamp2 is NIET aangeraakt

Dat is de kern: als je lamp1.turn_on() schrijft, stuurt Python lamp1 achter de schermen als self mee. De methode weet daardoor altijd welk object hij moet aanpassen.

Geen globale variabelen meer nodig. Elk Lamp-object draagt zijn eigen is_on-attribuut. Jij raakt ze nooit door elkaar β€” Python wijst de methode altijd aan het juiste object.

Zie het werken

Klik op turn_on() bij één van de lampen. Alleen diΓ© lamp gaat aan. De andere blijft uit β€” elk object heeft zijn eigen state.

>>> Oefenomgeving: Python REPL Simulator

Test dat de methode alleen het juiste object aanpast.

  1. lamp1 = Lamp("living room")
  2. lamp2 = Lamp("bedroom")
  3. lamp1.turn_on() β€” roep de methode aan op lamp1.
  4. lamp1.is_on β€” wat zie je?
  5. lamp2.is_on β€” is lamp2 ook veranderd?
  6. lamp2.toggle() β€” wissel lamp2.
  7. lamp2.is_on β€” nu?
Python 3.11 REPL Simulator Β· typ een commando en druk op Enter. # class Lamp: # def __init__(self, name): self.name=name; self.is_on=False # def turn_on(self): self.is_on = True # def turn_off(self): self.is_on = False # def toggle(self): self.is_on = not self.is_on
>>> 
🧩

Jouw opdracht: Enemy met fall() en reset()

Je geeft je vijand een methode die zichzelf laat vallen β€” nog zonder parameters. Zo verhuist de beweging van een losse functie naar het object zelf.

  1. Maak een class Enemy met in __init__ de attributen self.x, self.y = 0 en self.speed = 3.
  2. Voeg een methode fall(self) toe die self.y met self.speed verhoogt.
  3. Voeg een methode reset(self) toe die self.y weer op 0 zet.
  4. Maak twee vijanden: enemy1 en enemy2.
  5. Laat alléén enemy1 tweemaal vallen. Print daarna enemy1.y en enemy2.y en toon dat de tweede ongemoeid bleef.

Acceptatiecriteria

  • Enemy heeft fall() en reset() als methodes (met self, zonder verdere parameter).
  • Na tweemaal enemy1.fall() is enemy1.y == 6.
  • enemy2.y staat nog op 0 (niet geraakt).
  • Er is geen losse functie of globale variabele die de beweging doet.