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 2: De methode hoort bij de data

De fix voor taak 1: je verplaatst de losse functies naar binnen de class. Nu schrijf je rex.decrease_energy(20) โ€” de methode weet via self altijd aan welk object hij werkt, en heeft direct toegang tot alle attributen.

Methode = functie + weten welk object

Zodra je een functie binnen de class zet, wordt het een methode. Het verschil zit in self: de methode heeft automatisch toegang tot alle attributen van het object waarvoor hij wordt aangeroepen.

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

    def decrease_energy(self, points):
        self.energy -= points          # self.energy โ€” geen parameter nodig!

    def learn_trick(self):
        self.tricks += 1

    def get_status(self):
        return f"{self.name}: {self.energy} energy, {self.tricks} tricks"

Aanroepen:

rex   = Dog("Rex")
bella = Dog("Bella")

rex.decrease_energy(30)   # self = rex โ€” alleen rex.energy daalt
bella.learn_trick()       # self = bella โ€” alleen bella.tricks stijgt

print(rex.get_status())    # Rex: 70 energy, 0 tricks
print(bella.get_status())  # Bella: 100 energy, 1 tricks
self geeft altijd toegang tot alle attributen. Binnen decrease_energy heb je niet alleen self.energy, maar ook self.name en self.tricks โ€” zonder extra parameters.

Zie de spotlight

Klik op een actie bij rex of bella. De spotlight toont welk object self was tijdens de methode-aanroep.

>>> Oefenomgeving: Python REPL Simulator

Bewijs dat de methode alleen het juiste object aanpast.

  1. rex = Dog("Rex")
  2. bella = Dog("Bella")
  3. rex.decrease_energy(30)
  4. rex.energy โ€” daalde het?
  5. bella.energy โ€” ongewijzigd?
  6. bella.learn_trick()
  7. bella.tricks โ€” stijgt het?
  8. rex.tricks โ€” ongewijzigd?
  9. rex.get_status() โ€” status returnt een string.
Python 3.11 REPL Simulator ยท typ een commando en druk op Enter. # class Dog: # def __init__(self, name): self.name=name; self.energy=100; self.tricks=0 # def decrease_energy(self, points): self.energy -= points # def learn_trick(self): self.tricks += 1 # def get_status(self): return f"{self.name}: {self.energy}E, {self.tricks}T"
>>> 
๐Ÿงฉ

Jouw opdracht: sell() als methode van Product

Je refactort de losse functie uit taak 1 naar een echte methode van de class.

  1. Neem de Product-class uit taak 1 en verwijder de losse functie decrease_stock.
  2. Voeg aan de class de methode sell(self, amount) toe die de voorraad verlaagt.
  3. Voeg ook de methode get_status(self) toe die een f-string returnt met naam en voorraad.
  4. Maak twee Product-objecten. Roep apple.sell(3) aan. Bewijs dat pear.stock onveranderd is.
  5. Print de status van beide producten via get_status().

Acceptatiecriteria

  • sell is nu een methode van Product, geen losse functie.
  • De aanroep is apple.sell(3) โ€” het object staat voor de punt, niet tussen de haakjes.
  • get_status() returnt een f-string (geen print binnenin).
  • Na de aanroep is pear.stock nog 10.