Ga naar hoofdinhoud

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()

Uitvoer:

Hoera, Rex is nu 4.
Hoera, Rex is nu 5.

Het voordeel: wie de hond gebruikt, hoeft niet te weten hoe een verjaardag werkt. Hij roept verjaar() aan en de hond regelt het.

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