Ga naar hoofdinhoud

Python Dunder-methoden: speciale commando’s die je moet kennen

Leer hoe Pythons double underscore-methoden je eigen objecten op een natuurlijke manier laten werken met ingebouwde operaties, van printen tot rekenkunde. Ontdek hoe deze magic methods het ontwerpen van classes vereenvoudigen en krachtige gedragingen ontgrendelen.
Bijgewerkt 2 okt 2026  · 8 min lezen

Verken met AI

ChatGPTClaudePerplexity

Heb je je ooit afgevraagd hoe Python je eigen classes naadloos laat samenwerken met ingebouwde functies? Dat komt door die handige "dunder"-methoden—kort voor double underscore-methoden.

Stel, je maakt een class voor complexe getallen en je wilt de +-operator op een natuurlijke manier gebruiken. In plaats van extra code te schrijven om optellen af te handelen, definieer je een __add__-methode en Python doet de rest.

Deze magic methods, zoals __init__ voor het aanmaken van objecten en __str__ voor stringrepresentatie, worden automatisch door Python aangeroepen, zodat je ze niet direct zelf hoeft te callen. Ze voorkomen naamconflicten met je normale methoden en maken features mogelijk zoals operator-overloading en aangepast gedrag.

Of je nu objecten instantieert, rekenkundige bewerkingen uitvoert of simpelweg een object print, dunder-methoden werken stilletjes op de achtergrond om je code eleganter en efficiënter te maken. Ben je nieuw in Python en wil je de belangrijkste ideeën bijspijkeren? Volg dan onze cursus Introduction to Python voor een stevige basis.

Wat zijn dunder-methoden in Python?

Zoals ik al aangaf, zijn Python-dunder-methoden unieke, ofwel "magische", methoden die de ruggengraat vormen van Pythons datamodel door je eigen classes te laten integreren met Pythons ingebouwde operaties. Deze operators omvatten dingen als printen, vergelijken en rekenkunde uitvoeren.

Wanneer je methoden definieert zoals __init__ voor het initialiseren van objecten, __repr__ en __str__ voor objectrepresentatie, of zelfs __del__ voor opruimen, vertel je Python in feite hoe het standaardoperaties voor jouw objecten moet afhandelen. De interpreter roept deze methoden automatisch aan wanneer de bijbehorende operatie wordt uitgevoerd. Deze ingebouwde automatisering slaat een brug tussen native Python-features en door gebruikers gedefinieerde classes.

Later bekijken we voorbeelden van classes die deze methoden wel en niet gebruiken, zodat je kunt zien hoe dit allemaal werkt.

Categorieën dunder-methoden

Laten we de belangrijkste categorieën dunder-methoden verkennen en zien hoe ze je code krachtiger maken.

1. Initialisatie en constructie

Dunder-methoden zoals __new__, __init__ en __del__ bepalen hoe objecten worden gemaakt, geïnitialiseerd en uiteindelijk vernietigd.

  • __new__ vs. __init__: __new__ is verantwoordelijk voor het creëren van een nieuw exemplaar, terwijl __init__ het initialiseert. Deze scheiding is belangrijk bij immutabele types, waar je __new__ mogelijk voor iets anders overschrijft.

  • __del__: Deze methode fungeert als destructor en maakt opruimen mogelijk wanneer een object op het punt staat te worden opgeruimd door de garbage collector.

Je kunt __new__ zelfs aanpassen in immutabele classes om specifieke aanmaakregels af te dwingen.

2. Numerieke en rekenkundige methoden

Dunder-methoden zoals __add__, __sub__, __mul__ en hun in-place varianten laten je objecten rekenkundige operaties ondersteunen. Dit staat bekend als operator-overloading. Door deze methoden te definiëren, kun je natuurlijk rekenkundig gedrag voor je eigen objecten inschakelen.

Voorbeeld: overload __add__ in een Vector-class om overeenkomstige elementen van twee vectoren op te tellen. Dit is vooral handig bij het ontwerpen van classes die wiskundige concepten of financiële instrumenten modelleren.

3. Vergelijkings- en gelijkheidsmethoden

Methoden zoals __eq__, __lt__ en __gt__ bepalen hoe objecten worden vergeleken. Met deze methoden definieer je wat het betekent dat twee objecten gelijk zijn of hoe ze geordend moeten worden.

Een typisch voorbeeld is het vergelijken van de oppervlaktes van twee vormen: je kunt __lt__ overschrijven om true te retourneren als de oppervlakte van de ene vorm kleiner is dan die van de andere. Dit kan nuttig zijn in collecties of sorteeralgoritmen.

4. Methoden voor stringrepresentatie

De methoden __str__ en __repr__ bepalen hoe je objecten als strings worden weergegeven.

  • __repr__ moet een ontwikkelaarsvriendelijke representatie geven die kan worden gebruikt om het object opnieuw te creëren.

  • __str__ richt zich op een gebruiksvriendelijke weergave.

5. Container- en iterabele methoden

Om je objecten te laten gedragen als sequenties of containers, kun je methoden implementeren zoals __len__, __getitem__ en __iter__. Dit maakt operaties mogelijk zoals indexeren, itereren en lidmaatschapstests.

Als je bijvoorbeeld een eigen stack of lijst ontwerpt, kun je met deze methoden ingebouwde functies zoals len() gebruiken.

6. Aanroepbaarheid en functioneel programmeren

Met de methode __call__ kunnen instanties van je class worden aangeroepen als functies. Dit is vooral handig voor het maken van stateful function-objects die resultaten kunnen cachen of interne status kunnen bijhouden over meerdere calls. Zie het als je object veranderen in een mini-rekenengine die je herhaaldelijk kunt aanroepen met verschillende parameters.

7. Contextmanagers

Door __enter__ en __exit__ te implementeren, kun je je objecten gebruiken met de with-statement voor resourcebeheer. Dit is cruciaal voor het beheren van resources zoals bestands- of netwerkhandles, zodat ze correct worden ingesteld en opgeruimd.

Een praktijkvoorbeeld is een aangepaste contextmanager om databaseverbindingen veilig te openen en te sluiten.

8. Attributentoegang en descriptors

Methoden zoals __getattr__, __setattr__ en __delattr__ laten je bepalen hoe attributen worden benaderd en gewijzigd. Het descriptorprotocol verfijnt dit verder door objecten in staat te stellen attributentoegang dynamisch te beheren.

Een descriptor kan bijvoorbeeld attribuutwaarden valideren of transformeren en ervoor zorgen dat ze aan specifieke criteria voldoen voordat ze worden ingesteld.

Geavanceerde en overige dunder-methoden  

Hoewel de kern van dunder-methoden de meeste use-cases dekt, bevat Python geavanceerde en gespecialiseerde methoden voor taken zoals asynchrone programmering, metaprogrammeren en library-specifiek gedrag. Bijvoorbeeld:  

  • Asynchrone methoden: Methoden zoals __aiter__ en __anext__ maken asynchrone iteratie mogelijk, terwijl __await__ awaitable objecten ondersteunt.  

  • Metaprogrammeerhooks: Methoden zoals __prepare__ en __set_name__ maken dynamische classcreatie en attribuutbenaming mogelijk.  

  • Library-specifieke methoden: Libraries zoals NumPy of Pandas definiëren vaak eigen dunder-methoden (bijv. __array__ voor NumPy-integratie).

Deze geavanceerde methoden worden doorgaans gebruikt voor gespecialiseerde taken, waardoor de meeste ontwikkelaars ze niet dagelijks nodig hebben. Ze tonen echter Pythons flexibiliteit en diepgang. Ik raad aan om de officiële Python-datamodeldocumentatie te verkennen voor een volledige lijst. Deze bron biedt uitgebreide details over alle dunder-methoden en hun beoogde gebruik.

Alle dunder-methoden in Python

Python biedt meer dan 100 dunder-methoden, elk ontworpen om verschillende aspecten van objectgedrag te sturen. Hoewel we in dit artikel de belangrijkste categorieën hebben verkend, volgt hier een overzicht op hoog niveau als snelle referentie:

  • Rekenkundige methoden: Methoden zoals __add__, __sub__, __mul__ en __truediv__ laten je objecten operators ondersteunen (+, -, *, /).

  • Vergelijkingsmethoden: Methoden zoals __eq__, __lt__ en __gt__ definiëren hoe objecten worden vergeleken op gelijkheid of volgorde.

  • Attribuutbeheer: Met methoden zoals __getattr__, __setattr__ en __delattr__ kun je attributentoegang sturen en dynamisch gedrag implementeren.

  • Initialisatie en constructie: __new__, __init__ en __del__ beheren respectievelijk het maken, initialiseren en opruimen van objecten.

  • Stringrepresentatie: Methoden zoals __str__ en __repr__ bepalen hoe objecten als strings worden weergegeven en helpen bij gebruiksvriendelijke output.

  • Iteratie- en containergedrag: Implementeer __iter__ en __next__ om je objecten iterabel te maken, en andere methoden om indexering en lengteretrieval te ondersteunen.

  • Aanroepbaarheid: __call__ laat een instantie als een functie worden aangeroepen, wat een functionele programmeerstijl met stateful gedrag mogelijk maakt.

  • Contextbeheer: Met __enter__ en __exit__ kunnen objecten met with-statements worden gebruikt om resources goed te beheren.

  • Metaprogrammeerhooks: Methoden zoals __init_subclass__ bieden manieren om classcreatie en -gedrag dynamisch aan te passen.

Raadpleeg de officiële Python Data Model-documentatie voor een volledige, gedetailleerde lijst van deze dunder-methoden en hun functionaliteiten. Deze uitgebreide bron helpt je de volle kracht van Pythons objectmodel te benutten en elegantere, efficiëntere code te schrijven.

Praktijkvoorbeelden & use-cases

Laten we verkennen hoe dunder-methoden echte scenario’s kunnen aandrijven aan de hand van een paar voorbeelden.

Operator-overloading

Stel dat je een eigen numerieke of string-class hebt. Door dunder-methoden zoals __add__ of __mul__ te implementeren, laat je je objecten natuurlijk werken met rekenkundige operators. Je kunt instanties optellen, aftrekken of vermenigvuldigen zoals je met ingebouwde types zou doen, waardoor je eigen classes naadloos opgaan in Pythons rekenkundige operaties.

class Vector:
   def __init__(self, x, y):
        self.x = x
        self.y = y
   def __add__(self, other):
        return Vector(self.x + other.x, self.y + other.y)
   def __str__(self):
        return f"Vector({self.x}, {self.y})"

# Usage
v1 = Vector(1, 2)
v2 = Vector(3, 4)

result = v1 + v2
print(result)  # Output: Vector(4, 6)

Cachen met aanroepbaarheid

Wil je dure berekeningen niet herhalen? Door de methode __call__ te implementeren, kun je een object zich laten gedragen als een functie die resultaten cachet. Hiermee sla je de uitkomst van een zware berekening op en kun je die bij volgende aanroepen snel teruggeven, wat de performance optimaliseert en kostbare rekentijd bespaart.

class CachedComputation:
   def __init__(self):
        self.cache = {}
   def __call__(self, x):
        if x not in self.cache:
            self.cache[x] = self._expensive_computation(x)
        return self.cache[x]
   def _expensive_computation(self, x):
        # Imagine a complex calculation here
        return x ** 2

# Usage
compute = CachedComputation()

print(compute(5))  # Computes and caches: Output: 25
print(compute(5))  # Retrieves from cache: Output: 25

Aangepaste contextmanagers

Een contextmanager bouwen met __enter__ en __exit__ laat je resourcebeheer automatiseren. Je kunt bijvoorbeeld een aangepaste contextmanager ontwerpen om bestandsbewerkingen af te handelen—een bestand openen bij het betreden van een blok en ervoor zorgen dat het sluit wanneer je het blok verlaat. Dit vereenvoudigt je code en voorkomt veelvoorkomende fouten zoals resourcelekkages.

class FileHandler:
   def __init__(self, filename, mode):
        self.filename = filename
        self.mode = mode
   def __enter__(self):
        self.file = open(self.filename, self.mode)
        return self.file
   def __exit__(self, exc_type, exc_val, exc_tb):
        self.file.close()

# Usage
with FileHandler("example.txt", "r") as file:
    content = file.read()
    print(content)

Aangepaste iterables en containers

Om je eigen containers te laten werken met Pythons loops en comprehensions, implementeer je het iteratieprotocol door methoden zoals __iter__ en __next__ te definiëren. Of je nu een eigen stack, queue of een andere container bouwt, met deze methoden kunnen je objecten net als een gewone lijst worden doorlopen, wat de flexibiliteit en bruikbaarheid van je classes vergroot.

class Stack:
   def __init__(self):
        self.items = []
   def push(self, item):
	self.items.append(item)
   def pop(self):
        return self.items.pop()
   def __iter__(self):
        self.index = 0
        return self
   def __next__(self):
        if self.index >= len(self.items):
            raise StopIteration
        item = self.items[self.index]
        self.index += 1
        return item

# Usage
stack = Stack()
stack.push(1)
stack.push(2)
stack.push(3)

for item in stack:
    print(item)  # Output: 1, 2, 3

Voor meer over aangepaste iterables en containergedrag, bekijk de Python Lists Tutorial en Python List Functions & Methods Tutorial and Examples.

Best practices met dunder-methoden

Weten wanneer en hoe je dunder-methoden overschrijft is essentieel. Hier zijn enkele richtlijnen om in gedachten te houden:

Wanneer overschrijven

Overschrijf dunder-methoden alleen als je gedrag moet aanpassen. Als je bijvoorbeeld wilt dat je objecten op een specifieke manier rekenkunde of gelijkheidscontroles ondersteunen, dan is het de moeite waard om methoden zoals __add__ of __eq__ te implementeren.

Consistentie

Als je één methode overschrijft, zoals __eq__ voor gelijkheidscontroles, werk dan gerelateerde methoden zoals __hash__ overeenkomstig bij. Deze consistentie zorgt dat je objecten correct gedragen in collecties zoals sets of dictionaries.

Overmatig gebruik vermijden

Weersta de verleiding om nieuwe dunder-namen te creëren buiten Pythons standaarddatamodel. Door je aan de ingebouwde set dunder-methoden te houden, blijft je code duidelijk en voorkom je onverwacht gedrag.

Prestatieoverwegingen

Houd er rekening mee dat dunder-methoden overdreven overschrijven, vooral in vaak uitgevoerde delen van je code, de performance kan beïnvloeden. Streef naar efficiënte implementaties om vertragingen in high-frequency operaties te voorkomen.

Conclusie en verdere bronnen

Dunder-methoden stellen je Python-classes in staat om naadloos met de ingebouwde features van de taal te communiceren, waardoor je code schoner en intuïtiever wordt. Ze laten je objecten alles afhandelen van rekenkunde en vergelijkingen tot aangepast attributenbeheer, zonder extra moeite van jouw kant. Experimenteer met deze methoden in je projecten en ontdek hoe ze complexe operaties kunnen vereenvoudigen.

Voor meer diepgaande informatie, bekijk de officiële Python-datamodeldocumentatie. Onze DataCamp-bronnen zijn ook nuttig:


Oluseye Jeremiah's photo
Author
Oluseye Jeremiah
LinkedIn

Techschrijver gespecialiseerd in AI, ML en data science, die complexe ideeën helder en toegankelijk maakt.

Onderwerpen
Python

Leer Python met DataCamp

{count, plural, one {Cursus} other {Cursussen}}

Python voor gemiddeld niveau

{hours} uur
1.4M
Maak je data science skills sterker: creëer visualisaties met Matplotlib en bewerk DataFrames met pandas.
Bekijk detailsRight Arrow
Start Cursus
Meer bekijkenRight Arrow
Gerelateerd

{count, plural, one {blog} other {blogs}}

AI vanaf nul leren in 2026: een complete gids van de experts

Ontdek alles wat je moet weten om in 2026 AI te leren, van tips om te beginnen tot handige resources en inzichten van industrie-experts.
Adel Nehme's photo

Adel Nehme

15 min

Meer BekijkenMeer Bekijken