Na dit hoofdstuk kun je:
- een class schrijven die een “ding” modelleert,
- er objecten (instances) van maken,
- attributen en methodes gebruiken,
- en je kent de meest voorkomende beginnersfouten.
Wat is een class (nog even heel kort)? #
Een class is een blauwdruk.
Een object/instance is een “echte” versie van die blauwdruk.
Als je “User” als class hebt, dan zijn “Alice” en “Bob” objecten van die class.
Stap 1: Je eerste class (de kleinste werkende versie) #
class User:
passPythonDit is een geldige class, maar hij doet nog niets.
Een object maken (instantiëren):
u = User()
print(u) # iets als: <__main__.User object at ...>PythonStap 2: Attributen toevoegen (state) #
Je kunt dynamisch attributen toevoegen, maar dat is meestal niet ideaal:
u = User()
u.name = "Alice"
print(u.name)PythonDit werkt, maar het probleem is: niets dwingt af dat elk User-object een name heeft. Daarom gebruiken we bijna altijd __init__.
Stap 3: __init__ gebruiken (netjes initialiseren) #
class User:
def __init__(self, name):
self.name = name
alice = User("Alice")
bob = User("Bob")
print(alice.name) # Alice
print(bob.name) # BobPythonWat gebeurt hier:
User("Alice")maakt een nieuw object.- Python roept automatisch
__init__aan. selfis het object zelf (bijv.alice).self.name = nameslaat state op in het object.
Stap 4 — Methodes toevoegen (gedrag) #
class User:
def __init__(self, name):
self.name = name
def greet(self):
return f"Hi, ik ben {self.name}"
alice = User("Alice")
print(alice.greet()) # Hi, ik ben AlicePythonBelangrijk:
- Je roept een methode aan met
alice.greet() - Python geeft automatisch
selfmee.
Voorbeeld dat “echt” aanvoelt: BankAccount
class BankAccount:
def __init__(self, owner, balance=0):
self.owner = owner
self.balance = balance
def deposit(self, amount):
if amount <= 0:
raise ValueError("Amount must be positive")
self.balance += amount
def withdraw(self, amount):
if amount <= 0:
raise ValueError("Amount must be positive")
if amount > self.balance:
raise ValueError("Insufficient funds")
self.balance -= amount
acc = BankAccount("Alice", 100)
acc.deposit(50)
acc.withdraw(30)
print(acc.balance) # 120PythonHier zie je:
- state (
owner,balance) - gedrag (
deposit,withdraw) - regels/validatie zitten in het object (encapsulation begint al)
Veelgemaakte fouten (en hoe je ze herkent) #
1. self vergeten #
Fout:
class User:
def __init__(name):
self.name = namePython→ TypeError of rare errors, want Python verwacht self als eerste parameter.
Goed:
def __init__(self, name):
self.name = namePython2. self.name = name vergeten #
Fout:
class User:
def __init__(self, name):
name = name # doet niks nuttigsPython→ Later: AttributeError: 'User' object has no attribute 'name', want deze is dus niet goed initialiseert want self.name is niet benut enkel de parameter die je naar zichzelf veranderd (oftewel niks gebeurd).
3. Class variabele vs instance variabele door elkaar halen #
Dit is een klassieker:
class Team:
members = [] # PAS OP: gedeeld door alle instances!
t1 = Team()
t2 = Team()
t1.members.append("Alice")
print(t2.members) # ['Alice'] 😬PythonGoed (lijst per object):
class Team:
def __init__(self):
self.members = []
t1 = Team()
t2 = Team()
t1.members.append("Alice")
print(t2.members) # []PythonJe ziet dus dat weer de referentie naar self het uiteindelijke object ook daadwerkelijk zelfstandig laat opereren. Terwijl zonder deze referentie te gebruiken het gedeeld wordt over alle instanties en je dus (vaak) ongewenste functionaliteit krijgt.
Handige extra: objecten “mooi” printen #
Zonder extra’s print een object niet zo informatief. Voeg __repr__ toe:
class User:
def __init__(self, name):
self.name = name
def __repr__(self):
return f"User(name={self.name!r})"
print(User("Alice")) # User(name='Alice')PythonJe kan dus nu succesvol een object aanmaken en weet het verschil in de context van de variabelen door het gebruik van self. Lees in het volgende hoofdstuk wat het onderscheid is tussen self en __init__.

