15e Methoden die het object veranderen
In 15c veranderde je een attribuut van buitenaf: rex.leeftijd = 4. Een
methode kan dat ook, via self:
class Hond:
def __init__(self, naam, leeftijd):
self.naam = naam
self.leeftijd = leeftijd
def verjaar(self):
self.leeftijd += 1
print(f"Hoera, {self.naam} is nu {self.leeftijd}.")
rex = Hond("Rex", 3)
rex.verjaar()
rex.verjaar()
Een methode met een parameter
Na self mag een methode meer parameters hebben, net als een gewone functie.
Die geef je wél zelf mee:
class Hond:
def __init__(self, naam):
self.naam = naam
self.trucjes = []
def leer(self, trucje):
self.trucjes.append(trucje)
rex = Hond("Rex")
rex.leer("zitten")
rex.leer("rollen")
print(rex.trucjes)
Uitvoer:
['zitten', 'rollen']
Bij rex.leer("zitten") wordt self het object rex en trucje de tekst
"zitten".
Er gaat iets mis
class Hond:
def __init__(self, naam, leeftijd):
self.naam = naam
self.leeftijd = leeftijd
def verjaar(self):
leeftijd += 1
rex = Hond("Rex", 3)
rex.verjaar()
Uitvoer:
UnboundLocalError: cannot access local variable 'leeftijd' where it is not associated with a value
Zonder self. zoekt Python een gewone variabele leeftijd in de methode, en
die bestaat daar niet. De leeftijd van de hond heet in de methode
self.leeftijd.
Opdracht 15e.1: Bankrekening
Maak een klasse Rekening met een eigenaar en een saldo dat op 0
begint. Geef hem een methode stort(bedrag) die het saldo verhoogt, en een
methode toon() die het saldo print.
Verwachte uitvoer:
Saldo van Sara: 35 euro
class Rekening:
def __init__(self, eigenaar):
self.eigenaar = eigenaar
self.saldo = 0
def stort(self, bedrag):
print(f"Nog te doen: {bedrag} euro storten")
def toon(self):
print("Nog te doen: het saldo printen")
rekening = Rekening("Sara")
rekening.stort(20)
rekening.stort(15)
rekening.toon()Klik hier voor een tip.
stort krijgt twee parameters, self en bedrag, en doet
self.saldo += bedrag. toon heeft alleen self nodig.
Klik hier voor de oplossing.
class Rekening:
def __init__(self, eigenaar):
self.eigenaar = eigenaar
self.saldo = 0
def stort(self, bedrag):
self.saldo += bedrag
def toon(self):
print(f"Saldo van {self.eigenaar}: {self.saldo} euro")
rekening = Rekening("Sara")
rekening.stort(20)
rekening.stort(15)
rekening.toon()
Uitvoer:
Saldo van Sara: 35 euro
Opdracht 15e.2: Een stappenteller
Maak een klasse Stappenteller met een attribuut stappen dat op 0 begint,
en twee methoden: stap() telt er één stap bij, en loop(aantal) telt er
aantal bij.
Verwachte uitvoer:
2601 stappen
class Stappenteller:
def __init__(self):
self.stappen = 0
def stap(self):
print("Nog te doen: één stap tellen")
def loop(self, aantal):
print(f"Nog te doen: {aantal} stappen tellen")
teller = Stappenteller()
teller.stap()
teller.loop(2600)
print(f"{teller.stappen} stappen")Klik hier voor een tip.
__init__ heeft hier alleen self nodig, want een nieuwe teller staat
altijd op 0. stap doet self.stappen += 1.
Klik hier voor de oplossing.
class Stappenteller:
def __init__(self):
self.stappen = 0
def stap(self):
self.stappen += 1
def loop(self, aantal):
self.stappen += aantal
teller = Stappenteller()
teller.stap()
teller.loop(2600)
print(f"{teller.stappen} stappen")
Uitvoer:
2601 stappen