Skip to content
Programmeren in Python, leer de nieuwste technieken
Programmeren in PythonProgrammeren in Python
  • Home
  • Blog
  • Documentatie
  • Cursussen
Programmeren in PythonProgrammeren in Python
  • Home
  • Blog
  • Documentatie
  • Cursussen

Introductie

4
  • 1.1 Wat is Python?
  • 1.2 Python installatie
  • 1.2.1 Python installeren voor MacOS
  • 1.3 PyCharm Installatie

Basisprogrammering

6
  • 2.1 Python Basis: Variabelen, Datatypes en Operatoren
  • 2.2 Python if else (en elif)
  • 2.3 Python list (Array, Lijsten)
  • 2.4 Python Lussen: for loop, while loop, break, continue
  • 2.5 Python Functies: Definities, Parameters en Terugkeerwaarden
  • 2.6 Foutafhandeling: try, except, else, finally

Datatypes

13
  • 3.1 Introductie tot Geavanceerde Datatypes
  • 3.2 Python Tuple
  • 3.3 Python Set
  • 3.4 Python Dictionary
  • 3.5 Werken met Strings en String-methoden
  • 3.6 Collections Module: Krachtige Tools in Python
  • 3.7 Iterators en Generators
  • 3.8 List Comprehensions
  • 3.9 Geavanceerde Sortering
  • 3.10 Werken met Multi-dimensionale Data
  • 3.11 Typing en Datatypes
  • 3.12 Itertools voor Geavanceerde Iteraties
  • 3.13 Data Conversies

Modules

8
  • 4.1 Wat zijn Modules en Waarom zijn ze Belangrijk?
  • 4.2 Werken met Ingebouwde Modules
  • 4.3 Installeren en Gebruiken van Externe Pakketten
  • 4.4 Eigen Modules Maken
  • 4.5 Introductie tot Pakketten
  • 4.6 Importeren en Namespaces Begrijpen
  • 4.7 Geavanceerd: Relatief Importeren
  • 4.8 Organiseren van Grotere Projecten

Data Analyse

3
  • 5.1 Python Dataframe en Data Opschonen met Pandas
  • 5.2 Python Pandas Basisstatistieken en Data-analyse
  • 5.3 Python Numpy (NpArray): De Kracht van Numerieke Berekeningen

Webontwikkeling

5
  • 7.1 Inleiding tot Webontwikkeling
  • 7.2 HTTP-Verzoeken met requests: Communiceren met het Web
  • 7.3 Webscraping met BeautifulSoup: Data van het Web Halen als er geen APIs zijn
  • 7.4 Python Flask, een webserver & API tutorial
  • 7.5 WSGI & WebOb

Deploy

1
  • Deploy met Supervisor op Ubuntu

Object Georiënteerd Programmeren

8
  • Wat is Objectgeoriënteerd Programmeren (OOP) in Python?
  • Python class & object maken
  • self en __init__ uitgelegd (met voorbeelden)
  • Attributen afschermen: @property (getters/setters)
  • Overerving in Python + super() (en wanneer je het beter níet doet)
  • Dunder methods: __str__, __repr__, vergelijken (en waarom dit je OOP-code “Pythonic” maakt)
  • @dataclass: snelle nette classes (minder boilerplate, meer duidelijkheid)
  • OOP in de praktijk: design & structuur
View Categories
  • Home
  • Documentatie
  • Object Georiënteerd Programmeren
  • self en __init__ uitgelegd (met voorbeelden)

self en __init__ uitgelegd (met voorbeelden)

4 minuten leestijd

Na dit hoofdstuk snap je:

  • wat self precies is (en waarom het nodig is),
  • wat __init__ doet (en wat het níet is),
  • hoe method calls “onder water” werken,
  • hoe je omgaat met default values,
  • en de grootste valkuil: mutable defaults.

1. Wat is self? #

self is simpel gezegd: het object waar je op werkt.

Als je dit doet:

alice.greet()
Python

dan betekent dat eigenlijk:

User.greet(alice)
Python

Dus: self is gewoon de eerste parameter van een instance-methode, en Python vult die automatisch in met het object (de instance).

Voorbeeld ter illustratie

class User:
    def greet(self):
        return f"Hi, ik ben {self}"

alice = User()
print(alice.greet())
print(User.greet(alice))
Python

Beide calls doen hetzelfde. De tweede vorm maakt zichtbaar wat er gebeurt.

Waarom heet het self?
Conventie. Je kán het anders noemen, maar doe het niet: iedereen verwacht self.

2. Waarom is self nodig? #

Omdat een methode meestal iets moet kunnen:

  • lezen uit het object (self.name)
  • schrijven naar het object (self.balance += 10)
  • of andere methodes op hetzelfde object aanroepen (self.reset())

Zonder self weet de methode niet welke instance hij moet aanpassen.

3. Wat doet __init__? #

__init__ is de methode die Python automatisch aanroept direct nadat een object is aangemaakt.

  • __init__ zet meestal de begin-state (attributen) klaar.
  • __init__ maakt het object niet; dat doet __new__ (geavanceerder, vaak niet nodig).

Praktisch onthouden:

__init__ = initialiseren van de instance

Voorbeeld:

class User:
    def __init__(self, name):
        self.name = name

alice = User("Alice")
Python

4. Hoe werkt __init__ met parameters? #

Positional & keyword arguments #
class User:
    def __init__(self, name, is_admin=False):
        self.name = name
        self.is_admin = is_admin

User("Alice")
User("Bob", True)
User(name="Carol", is_admin=True)
Python

Default values zijn supernormaal

Default parameters maken je class makkelijker te gebruiken.

5. Meerdere manieren om te initialiseren (Pythonic opties) #

Soms wil je “alternate constructors”, zoals:

  • user maken vanuit JSON
  • user maken vanuit een email

In Python doe je dat vaak met class methods:

class User:
    def __init__(self, name):
        self.name = name

    @classmethod
    def from_email(cls, email):
        name = email.split("@")[0]
        return cls(name)

u = User.from_email("alice@example.com")
print(u.name)  # alice
Python

Dit is later handig bij “net” ontwerpen.

6. De grootste valkuil: mutable default arguments #

Het probleem #

Dit ziet er onschuldig uit, maar is een bug-magneet:

class Team:
    def __init__(self, members=[]):
        self.members = members
Python

Waarom fout?

  • Die lege lijst [] wordt één keer gemaakt bij het definiëren van de functie.
  • En daarna gedeeld door alle instances die de default gebruiken.

Gevolg:

t1 = Team()
t2 = Team()
t1.members.append("Alice")
print(t2.members)  # ['Alice'] 😬
Python

De juiste oplossing #

Gebruik None en maak dan binnenin een nieuwe lijst:

class Team:
    def __init__(self, members=None):
        self.members = [] if members is None else list(members)
Python

Nu krijgt elk object zijn eigen lijst.

Regel om te onthouden:

Gebruik geen [], {}, set() als default argument in __init__ (of in functies). Gebruik None.

7. Wanneer zet je validatie in __init__? #

Als je object anders “ongeldig” kan bestaan.

Voorbeeld:

class Product:
    def __init__(self, name, price):
        if price < 0:
            raise ValueError("Price cannot be negative")
        self.name = name
        self.price = price
Python

Vuistregel: als een regel altijd waar moet zijn (invariant), bewaak hem in __init__ of via properties/methodes.

Samenvatting (kort) #

  • self = de instance waar je mee werkt; Python vult hem automatisch in bij obj.method().
  • __init__ = init van state; geen object-creator (dat is __new__).
  • Default args zijn top, maar vermijd mutable defaults → gebruik None.
Updated on januari 4, 2026

What are your Feelings

Python class & object makenAttributen afschermen: @property (getters/setters)
Inhoudsopgave
  • 1. Wat is self?
  • 2. Waarom is self nodig?
  • 3. Wat doet __init__?
  • 4. Hoe werkt __init__ met parameters?
    • Positional & keyword arguments
  • 5. Meerdere manieren om te initialiseren (Pythonic opties)
  • 6. De grootste valkuil: mutable default arguments
    • Het probleem
    • De juiste oplossing
  • 7. Wanneer zet je validatie in __init__?
  • Samenvatting (kort)
Programmeren in Python

Leer python op je eigen tempo met mooie interactieve hedendaagse voorbeelden.

© Copyright 2026 Programmeren in Python.
Sign inSign up

Sign in

Don’t have an account? Sign up
Lost your password?

Sign up

Already have an account? Sign in