Sprint 7 · Methodes & self  ·  US2: Methodes zijn geen functies

Als developer, wil ik gedrag vastleggen bij de data waar het bij hoort in plaats van in losse functies ernaast, zodat elke aanroep automatisch weet op welk object hij werkt.

Taak 3: Methodes die samenwerken

Methodes op hetzelfde object kunnen elkaar aanroepen via self. Een methode play() kan intern self.decrease_energy(5) aanroepen — zo bouw je gedrag op uit kleinere stukjes, zonder die stukjes van buiten aan te sturen.

Een methode roept een andere methode aan via self

Methodes op hetzelfde object kunnen elkaar aanroepen. De truc: binnen een methode gebruik je self om een andere methode van hetzelfde object aan te roepen.

class Dog:
    def __init__(self, name):
        self.name    = name
        self.energy  = 100
        self.tricks  = 0

    def decrease_energy(self, points):
        self.energy = max(0, self.energy - points)

    def play(self):
        self.decrease_energy(5)   # roept een andere methode aan!
        self.tricks += 1
        print(f"{self.name} plays! Energy: {self.energy}, tricks: {self.tricks}")

Wanneer je rex.play() aanroept, wordt intern self.decrease_energy(5) aangeroepen — waarbij self nog steeds rex is. Er is geen verwarring over welk object bedoeld wordt.

Één aanroep, meerdere effecten. rex.play() regelt intern de energie verlagen én een trick optellen — de aanroeper hoeft niets te weten over die details.

Stap voor stap

Druk op Volgende stap om te zien wat er van binnen gebeurt als je rex.play() aanroept.

Stap 0 — begin
rex (Dog)
name = "Rex"
energy = 100
tricks = 0
Wacht op aanroep…
>>> Oefenomgeving: Python REPL Simulator

Volg de keten van methode-aanroepen.

  1. rex = Dog("Rex")
  2. rex.energy — beginstatus.
  3. rex.play() — roept intern decrease_energy(5) én increase_tricks() aan.
  4. rex.energy — gedaald naar 95?
  5. rex.tricks — gestegen naar 1?
  6. rex.play() — nogmaals.
  7. rex.energy — nu 90?
  8. rex.get_status() — alles in één string.
Python 3.11 REPL Simulator · typ een commando en druk op Enter. # class Dog: # def play(self): # self.decrease_energy(5) # intern aanroepen! # self.tricks += 1 # print(f"{self.name} plays! E:{self.energy} T:{self.tricks}")
>>> 
🧩

Jouw opdracht: sell() activeert check_low_stock()

Je bouwt een Product-class waarbij een methode intern een andere methode aanroept.

  1. Maak de class Product met self.name, self.stock = 10 en self.restock_needed = False.
  2. Schrijf de methode check_low_stock(self). Is de voorraad 3 of lager? Dan zet de methode self.restock_needed = True en print "[name] is almost sold out!".
  3. Schrijf de methode sell(self, amount) die de voorraad verlaagt en daarna intern self.check_low_stock() aanroept.
  4. Maak twee Product-objecten. Verkoop drie keer 3 stuks van apple. Zorg dat de melding verschijnt op het moment dat de voorraad 3 of lager wordt.
  5. Controleer dat pear.restock_needed nog False is.

Acceptatiecriteria

  • Na drie keer apple.sell(3) is apple.restock_needed == True.
  • check_low_stock() wordt aangeroepen vanuit sell() — niet van buiten.
  • pear.restock_needed is nog False.
  • De melding komt via print, niet via return.