← Python/Eigen typen
Les 3 van 8
MODULE 07 · 03◷ 26 min

Methoden gebruiken de toestand van hun instantie

Na deze les kun je
  • Een methode met self op de juiste instantie laten werken.
  • Een retourwaarde onderscheiden van een wijziging aan het object.
  • Een gebonden methode en een andere instantie bewust gebruiken.

Een scorebord bewaart punten, maar er zijn ook handelingen die bij die punten horen. Als je die handelingen bij het object onderbrengt, hoeft de aanroeper niet telkens zelf uit te zoeken welk attribuut moet veranderen. Een methode verbindt een bewerking met de instantie waarop zij werkt.

Een functie bij een object

Een methode is hier een functie die in het klasseblok is gedefinieerd. Haar eerste parameter self verwijst naar de instantie. Bij board.add(3) geeft Python board als die eerste parameter mee en 3 als het volgende argument.

Je schrijft dus def add(self, points):, terwijl de aanroeper board.add(3) gebruikt. De naam self is een conventie die de bedoeling duidelijk maakt. Het is geen speciaal sleutelwoord waarvoor een andere naam de werking zou veranderen.

De methode kan bestaande attributen lezen en aanpassen. Een berekening met self.points gebruikt de toestand van dat ene scorebord. Dat is vooral nuttig wanneer meerdere objecten tegelijk bestaan.

Een methode past haar eigen scorebord aan
class ScoreBoard:
    def __init__(self):
        self.points = 0

    def add(self, points):
        self.points += points
        return self.points

board = ScoreBoard()
print(board.add(3))
print(board.add(2))
print(board.points)
Verwachte uitvoer
3
5
5

Een return en een wijziging hebben elk hun afspraak

Een methode kan een nieuwe waarde teruggeven én de instantie veranderen. Zij kan ook alleen gegevens lezen, of een wijziging uitvoeren en None teruggeven. Maak die afspraak duidelijk, zodat de aanroeper niet hoeft te raden wat een resultaat betekent.

In de opdrachten geeft increment de nieuwe tellerstand terug. reset verandert de stand naar nul en geeft None. read leest alleen en laat de bestaande stand intact.

Een functie die alleen het juiste antwoord uitrekent maar de teller niet aanpast, voldoet niet aan de afspraak van increment. Andersom is alleen aanpassen niet genoeg wanneer de aanroeper een getal terug moet krijgen. De controles onderzoeken daarom zowel de retourwaarde als de toestand na de aanroep.

Een gebonden methode bewaren

Je kunt een methode ook eerst aan een andere naam toekennen. Zo'n gebonden methode onthoudt bij welke instantie zij hoort. Wanneer je haar later aanroept, hoef je dat object niet opnieuw als argument mee te geven.

Een gebonden methode bewaart de instantie
class ScoreBoard:
    def __init__(self):
        self.points = 0

    def add(self, points):
        self.points += points
        return self.points

first = ScoreBoard()
second = ScoreBoard()
add_later = first.add
print(add_later(4))
print(first.points)
print(second.points)
Verwachte uitvoer
4
4
0

Dit sluit aan op functies als waarden uit de functiemodule. De extra verbinding is de instantie die bij de methode hoort. Twee afzonderlijke scoreborden blijven hun eigen stand houden, ook wanneer je hun methoden bewaart en later aanroept.

Veelgemaakte fout: rekenen zonder bewaren

De losse expressie self.value + amount berekent een uitkomst maar wijzigt het attribuut niet. Gebruik een toekenning wanneer de bedoeling is de tellerstand te veranderen. Met self.value += amount maak je de nieuwe waarde onderdeel van de objecttoestand.

Een lokale variabele met de naam value is evenmin automatisch hetzelfde attribuut. Net als in de vorige les bepaalt de puntnotatie aan welk object de waarde hangt. Een globale teller of een waarde op de klasse zelf zou meerdere instanties onbedoeld koppelen.

Twee objecten gebruiken

add_from leest de stand van een andere teller en telt die bij de huidige stand op. In deze oefening gebruik je hiervoor twee verschillende Counter-instanties. De andere teller blijft onveranderd; alleen de ontvangende instantie krijgt een nieuwe stand.

Bewaar daarom de waarde die je nodig hebt zonder het andere object leeg te maken, te resetten of als vervanging voor self te gebruiken. Nul en negatieve waarden volgen hier gewone optelling. Domeinregels voor een beperkt bereik komen in de volgende les aan bod.

AAN DE SLAG 0/4
1

De stand wijzigen en teruggeven

Vul Counter.increment(amount) aan: tel amount bij value van deze instantie op en geef de nieuwe stand terug. Nul en negatieve bedragen volgen gewone optelling. Ook een bewaarde gebonden methode blijft op dezelfde instantie werken.

2

Reset heeft een eigen retourafspraak

Vul Counter.reset() aan: maak value van deze instantie nul en geef None terug. Een bestaande positieve, nul- of negatieve stand krijgt dezelfde reset.

3

Een andere teller alleen lezen

Vul Counter.add_from(other) aan: tel other.value bij self.value op en geef de nieuwe stand van self terug. De twee instanties zijn verschillend; other blijft onveranderd.

4

Uitlezen zonder wijziging

Vul Counter.read() aan: geef de huidige value van deze instantie terug en verander niets. Bewaar ook een nul of negatieve stand precies.

Onthoud dit

  • Een methode krijgt haar instantie via de eerste parameter self.
  • Controleer afzonderlijk wat zij teruggeeft en wat zij verandert.
  • Een gebonden methode bewaart de verbinding met haar eigen object.

Hierna bewaak je een geldige toestand via een property en gerichte validatie.

main.py
UitvoerPython
›
›_

Hier komt je resultaat.

Voer je code uit en ontdek
wat je hebt gemaakt.

0/4 stappen
EVEN MEEKIJKEN

Bekijk hoe het kan.

Je mag de oplossing bekijken. Deze poging telt dan niet mee als afgeronde les. Met Reset kun je daarna opnieuw zelf oefenen.