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.
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.
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.
is_on-attribuut. Jij raakt ze nooit door
elkaar β Python wijst de methode altijd aan het juiste object.
Klik op turn_on() bij één van de lampen. Alleen diΓ© lamp gaat aan. De andere blijft uit β elk object heeft zijn eigen state.
Test dat de methode alleen het juiste object aanpast.
lamp1 = Lamp("living room")lamp2 = Lamp("bedroom")lamp1.turn_on() β roep de methode aan op lamp1.lamp1.is_on β wat zie je?lamp2.is_on β is lamp2 ook veranderd?lamp2.toggle() β wissel lamp2.lamp2.is_on β nu?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.
Enemy met in __init__ de attributen
self.x, self.y = 0 en self.speed = 3.fall(self) toe die self.y met self.speed
verhoogt.reset(self) toe die self.y weer op 0 zet.enemy1 en enemy2.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).enemy1.fall() is enemy1.y == 6.enemy2.y staat nog op 0 (niet geraakt).