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
  • @dataclass: snelle nette classes (minder boilerplate, meer duidelijkheid)

@dataclass: snelle nette classes (minder boilerplate, meer duidelijkheid)

4 minuten leestijd

Na dit hoofdstuk snap je:

  • wat een dataclass is en waarom het bestaat,
  • hoe @dataclass automatisch __init__, __repr__, __eq__ (en meer) voor je maakt,
  • hoe je default values doet (en waarom default_factory belangrijk is),
  • wat frozen=True betekent (immutability + hashing),
  • en wanneer je juist géén dataclass moet gebruiken.

1. Waarom bestaan dataclasses? #

Je merkt het snel als je veel “data-objecten” hebt:

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __repr__(self):
        return f"Point(x={self.x}, y={self.y})"

    def __eq__(self, other):
        if not isinstance(other, Point):
            return NotImplemented
        return (self.x, self.y) == (other.x, other.y)
Python

Dit is veel herhaalwerk voor iets simpels.

Een dataclass doet dat voor je.

2. Eerste dataclass (veel korter, zelfde resultaat) #

from dataclasses import dataclass

@dataclass
class Point:
    x: int
    y: int

p = Point(1, 2)
print(p)        # Point(x=1, y=2)
print(p == Point(1, 2))  # True
Python

Wat je “gratis” krijgt:

  • __init__(x, y)
  • __repr__
  • __eq__
  • en handige extras zoals makkelijk vergelijken/printen

Belangrijk: die x: int en y: int zijn type hints. Ze zijn niet verplicht, maar dataclasses werken er heel goed mee (en tooling ook).

3. Default values (simpel) #

from dataclasses import dataclass

@dataclass
class User:
    name: str
    is_admin: bool = False

print(User("Alice"))
# User(name='Alice', is_admin=False)
Python

4. Mutable defaults: waarom field(default_factory=...) bestaat #

Net als bij functies en __init__ geldt:

Gebruik geen [] of {} direct als default, want dan deel je dezelfde lijst/dict.

Fout

from dataclasses import dataclass

@dataclass
class Team:
    members: list[str] = []  # ❌ gedeelde lijst
Python

Goed

from dataclasses import dataclass, field

@dataclass
class Team:
    members: list[str] = field(default_factory=list)
Python

Nu krijgt elke Team() zijn eigen lijst.

5. Validatie en afgeleide velden: __post_init__ #

Een dataclass maakt automatisch __init__, maar soms wil je extra checks of conversies.

Daarvoor is __post_init__: die draait na de auto-generated __init__.

from dataclasses import dataclass

@dataclass
class Product:
    name: str
    price: float

    def __post_init__(self):
        if self.price < 0:
            raise ValueError("Price cannot be negative")
        self.price = float(self.price)
Python

Waarom niet alles in properties?

  • Kan wel, maar __post_init__ is vaak de simpelste plek voor “init-validatie”.

6. Immutability: frozen=True #

Soms wil je objecten die niet mogen veranderen (handig voor value objects).

from dataclasses import dataclass

@dataclass(frozen=True)
class Money:
    currency: str
    amount: int
Python

Nu kan dit niet:

m = Money("EUR", 10)
m.amount = 20  # Geef fout: FrozenInstanceError
Python

Waarom is dit handig?

  • Minder bugs: state verandert niet stiekem.
  • Je kunt zulke objecten vaak veilig als dict-key gebruiken (hashing).

7. Hashing (kort maar belangrijk) #

Als je frozen=True gebruikt, kan Python meestal een __hash__ genereren die klopt bij __eq__.
Daardoor kan je Money("EUR", 10) in een set stoppen of als key gebruiken.

Als je object wél mutable is, is dat gevaarlijk → daarom is hashing vaak uitgeschakeld.

8. Wanneer gebruik je een dataclass (en wanneer niet)? #

Dataclass is top voor: #
  • “data carriers”: DTO’s, config objects, simpele domeinobjecten
  • value objects: Point, Money, Address
  • objecten waar je vooral velden hebt en weinig complex gedrag
Liever geen dataclass als: #
  • je class vooral gedrag heeft en weinig data
  • je zware invarianten hebt die je constant moet bewaken (dan past property/encapsulation vaak beter)
  • je init heel custom is (kan nog steeds met dataclass, maar dan verlies je de eenvoud)

Praktisch: begin gerust met dataclass voor simpele dingen. Als je class complexer wordt, kun je altijd refactoren.

Hartstikke goed, nu heb je de meeste concepten van OOP gehad. Zie het laatste hoofdstuk om de toepasbaarheid nog beter te leren.

Updated on januari 4, 2026

What are your Feelings

Dunder methods: __str__, __repr__, vergelijken (en waarom dit je OOP-code “Pythonic” maakt)OOP in de praktijk: design & structuur
Inhoudsopgave
  • 1. Waarom bestaan dataclasses?
  • 2. Eerste dataclass (veel korter, zelfde resultaat)
  • 3. Default values (simpel)
  • 4. Mutable defaults: waarom field(default_factory=...) bestaat
  • 5. Validatie en afgeleide velden: __post_init__
  • 6. Immutability: frozen=True
  • 7. Hashing (kort maar belangrijk)
  • 8. Wanneer gebruik je een dataclass (en wanneer niet)?
    • Dataclass is top voor:
    • Liever geen dataclass als:
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