Kurs
Python Dunder Methoden: Besondere Befehle, die man kennen sollte
Hast du dich jemals gefragt, wie Python dafür sorgt, dass deine eigenen Klassen nahtlos mit den eingebauten Funktionen zusammenarbeiten? Das ist den raffinierten "Dunder"-Methoden zu verdanken - kurz für "double underscore"-Methoden.
Stell dir vor, du erstellst eine Klasse für komplexe Zahlen und möchtest natürlich den +
Operator verwenden. Anstatt zusätzlichen Code für die Addition zu schreiben, definierst du eine __add__
Methode, und Python kümmert sich um den Rest.
Diese magischen Methoden, wie __init__
für die Objekterzeugung und __str__
für die String-Darstellung, werden automatisch von Python aufgerufen, sodass du sie nicht direkt aufrufen musst. Sie verhindern Namenskonflikte mit deinen regulären Methoden und ermöglichen Funktionen wie Operatorüberladung und benutzerdefiniertes Verhalten.
Ob es darum geht, Objekte zu instanziieren, arithmetische Operationen auszuführen oder einfach ein Objekt auszudrucken - dunder-Methoden arbeiten leise im Hintergrund und machen deinen Code eleganter und effizienter. Wenn du neu in Python bist und dich mit den wichtigsten Ideen vertraut machen willst, solltest du unseren Kurs Einführung in Python besuchen, um eine gute Grundlage zu schaffen.
Was sind Dunder-Methoden in Python?
Wie ich bereits erwähnt habe, sind die Dunder-Methoden von Python einzigartige oder "magische" Methoden, die das Rückgrat des Datenmodells von Python bilden, indem sie es deinen benutzerdefinierten Klassen ermöglichen, sich in die eingebauten Operationen von Python zu integrieren. Zu diesen Operatoren gehören Dinge wie Drucken, Vergleichen und Rechnen.
Wenn du Methoden wie __init__
für die Initialisierung von Objekten, __repr__
und __str__
für die Objektdarstellung oder sogar __del__
für das Aufräumen definierst, sagst du Python im Wesentlichen, wie es die Standardoperationen für deine Objekte handhaben soll. Der Interpreter ruft diese Methoden automatisch auf, wenn die entsprechende Operation durchgeführt wird. Diese integrierte Automatisierung schlägt eine Brücke zwischen nativen Python-Funktionen und benutzerdefinierten Klassen.
Später werden wir uns Beispiele von Klassen ansehen, die diese Methoden verwenden und solche, die sie nicht verwenden, damit du siehst, wie das alles funktioniert.
Kategorien von Dunder-Methoden
Lass uns die Hauptkategorien der Dunder-Methoden erkunden und sehen, wie sie deinen Code stärken.
1. Initialisierung und Konstruktion
Dunder-Methoden wie __new__
, __init__
und __del__
steuern, wie Objekte erstellt, initialisiert und schließlich zerstört werden.
-
__new__
vs.__init__
:__new__
ist für die Erstellung einer neuen Instanz zuständig, während__init__
diese initialisiert. Diese Trennung ist wichtig, wenn du mit unveränderlichen Typen arbeitest, bei denen du__new__
vielleicht für etwas anderes überschreibst. -
__del__
: Diese Methode fungiert als Destruktor und ermöglicht das Aufräumen, wenn ein Objekt als Garbage gesammelt werden soll.
Du kannst sogar die __new__
in unveränderlichen Klassen anpassen, um bestimmte Erstellungsregeln zu erzwingen.
2. Numerische und arithmetische Methoden
Dunder-Methoden wie __add__
, __sub__
, __mul__
und ihre In-Place-Varianten ermöglichen es deinen Objekten, arithmetische Operationen zu unterstützen. Dies wird als Operator-Überladung bezeichnet. Indem du diese Methoden definierst, kannst du ein natürliches arithmetisches Verhalten für deine benutzerdefinierten Objekte ermöglichen.
Überlade zum Beispiel __add__
in einer Vector
Klasse, um die entsprechenden Elemente zweier Vektoren zu addieren. Dies ist besonders nützlich, wenn du Klassen entwirfst, die mathematische Konzepte oder Finanzinstrumente modellieren.
3. Vergleichs- und Gleichstellungsmethoden
Methoden wie __eq__
, __lt__
und __gt__
bestimmen, wie Objekte verglichen werden. Mit diesen Methoden kannst du festlegen, was es bedeutet, dass zwei Objekte gleich sind oder wie sie angeordnet werden sollen.
Ein typisches Beispiel ist der Vergleich der Flächen zweier Formen: Du kannst __lt__
überschreiben und true
zurückgeben, wenn die Fläche der einen Form kleiner ist als die der anderen. Das kann bei Sammlungen oder Sortieralgorithmen hilfreich sein.
4. Methoden der String-Darstellung
Die Methoden __str__
und __repr__
steuern, wie deine Objekte als Strings angezeigt werden.
-
__repr__
sollte eine entwicklerfreundliche Darstellung bieten, mit der du das Objekt neu erstellen kannst. -
__str__
konzentriert sich auf ein benutzerfreundliches Display.
5. Container und iterierbare Methoden
Damit sich deine Objekte wie Sequenzen oder Container verhalten, kannst du Methoden wie __len__
, __getitem__
, und __iter__
implementieren. Dies ermöglicht Operationen wie Indizierung, Iteration und Mitgliedschaftstests.
Wenn du zum Beispiel einen benutzerdefinierten Stapel oder eine Liste entwirfst, kannst du durch die Implementierung dieser Methoden integrierte Funktionen wie len()
verwenden.
6. Aufrufbarkeit und funktionale Programmierung
Mit der Methode __call__
können die Instanzen deiner Klasse wie Funktionen aufgerufen werden. Dies ist besonders nützlich für die Erstellung von zustandsbehafteten Funktionsobjekten, die Ergebnisse zwischenspeichern oder den internen Zustand über Aufrufe hinweg beibehalten können. Stell dir vor, du verwandelst dein Objekt in eine Mini-Rechenmaschine, die du wiederholt mit verschiedenen Parametern aufrufen kannst.
7. Kontext-Manager
Durch die Implementierung der Methoden __enter__
und __exit__
können deine Objekte mit der Anweisung zur Ressourcenverwaltung verwendet werden. Dies ist wichtig für die Verwaltung von Ressourcen wie Datei-Handles oder Netzwerkverbindungen, um sicherzustellen, dass sie korrekt eingerichtet und bereinigt werden.
Ein praktisches Szenario ist die Verwendung eines benutzerdefinierten Kontextmanagers zum sicheren Öffnen und Schließen von Datenbankverbindungen.
8. Zugriff auf Attribute und Deskriptoren
Mit Methoden wie __getattr__
, __setattr__
und __delattr__
kannst du steuern, wie auf Attribute zugegriffen und sie verändert werden. Das Deskriptor-Protokoll verfeinert dies noch, indem es Objekten ermöglicht, den Zugriff auf Attribute dynamisch zu verwalten.
Ein Deskriptor kann zum Beispiel Attributwerte validieren oder umwandeln, um sicherzustellen, dass sie bestimmte Kriterien erfüllen, bevor sie gesetzt werden.
Fortgeschrittene und verschiedene Dunder-Methoden
Während die grundlegenden Dunder-Methoden die meisten Anwendungsfälle abdecken, enthält Python fortgeschrittene und spezialisierte Methoden für Aufgaben wie asynchrone Programmierung, Metaprogrammierung und bibliotheksspezifisches Verhalten. Zum Beispiel:
-
Asynchrone Methoden: Methoden wie
__aiter__
und__anext__
ermöglichen asynchrone Iterationen, während__await__
wartbare Objekte unterstützt. -
Metaprogrammierungshaken: Methoden wie
__prepare__
und__set_name__
ermöglichen die dynamische Erstellung von Klassen und die Benennung von Attributen. -
Bibliotheksspezifische Methoden: Bibliotheken wie NumPy oder Pandas definieren oft eigene Dunder-Methoden (z. B.
__array__
für die Integration von NumPy).
Diese fortgeschrittenen Methoden werden in der Regel für spezielle Aufgaben verwendet, so dass die meisten Entwickler sie nicht täglich benötigen. Sie zeigen jedoch die Flexibilität und Tiefe von Python. Ich empfehle, die offizielle Python-Dokumentation zum Datenmodell zu lesen, um eine vollständige Liste zu erhalten. Diese Ressource bietet umfassende Informationen über alle Dunder-Methoden und ihren Verwendungszweck.
Alle Dunder-Methoden in Python
Python bietet über 100 Dunder-Methoden, die jeweils verschiedene Aspekte des Objektverhaltens steuern. In diesem Artikel haben wir uns mit den wichtigsten Kategorien befasst, aber hier ist eine Zusammenfassung, die als schnelle Referenz dienen soll:
-
Arithmetische Methoden: Methoden wie
__add__
,__sub__
,__mul__
und__truediv__
ermöglichen es deinen Objekten, Operatoren zu unterstützen (+
,-
,*
,/
). -
Vergleichsmethoden: Methoden wie
__eq__
,__lt__
und__gt__
definieren, wie Objekte auf Gleichheit oder Reihenfolge verglichen werden. -
Attribute verwalten: Mit Methoden wie
__getattr__
,__setattr__
und__delattr__
kannst du den Zugriff auf Attribute steuern und dynamische Verhaltensweisen implementieren. -
Initialisierung und Aufbau:
__new__
,__init__
und__del__
verwalten die Erstellung, Initialisierung und Bereinigung von Objekten. -
String-Darstellung: Methoden wie
__str__
und__repr__
bestimmen, wie Objekte als Zeichenketten dargestellt werden, was eine benutzerfreundliche Ausgabe ermöglicht. -
Iteration und Containerverhalten: Implementiere
__iter__
und__next__
, um deine Objekte iterierbar zu machen, und andere Methoden, um Indizierung und Längenabfrage zu unterstützen. -
Aufrufbarkeit:
__call__
lässt eine Instanz wie eine Funktion aufrufen und ermöglicht so einen funktionalen Programmierstil mit zustandsorientiertem Verhalten. -
Context Management: Mit
__enter__
und__exit__
können Objekte mit Anweisungen verwendet werden, um Ressourcen richtig zu verwalten. -
Metaprogrammier-Haken: Methoden wie
__init_subclass__
ermöglichen es, die Erstellung und das Verhalten von Klassen dynamisch anzupassen.
Eine vollständige und detaillierte Liste dieser Dunder-Methoden und ihrer Funktionen findest du in der offiziellen Python Data Model Dokumentation. Dieses umfassende Handbuch hilft dir, das Objektmodell von Python voll auszuschöpfen und eleganten, effizienten Code zu schreiben.
Beispiele aus der Praxis und Anwendungsfälle
Lass uns anhand einiger Beispiele untersuchen, wie Dunder-Methoden in der realen Welt eingesetzt werden können.
Operator-Überladung
Stell dir vor, du hast eine eigene numerische oder String-Klasse. Indem du Dunder-Methoden wie __add__
oder __mul__
implementierst, ermöglichst du deinen Objekten, auf natürliche Weise mit arithmetischen Operatoren zu arbeiten. Du kannst Instanzen genau wie bei den eingebauten Typen addieren, subtrahieren oder multiplizieren, so dass sich deine benutzerdefinierten Klassen nahtlos in die arithmetischen Operationen von Python einfügen.
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)
Caching mit Abrufbarkeit
Wolltest du schon immer vermeiden, teure Berechnungen zu wiederholen? Indem du die Methode __call__
implementierst, kannst du dafür sorgen, dass sich ein Objekt wie eine Funktion verhält, die ihre Ergebnisse zwischenspeichert. So kannst du das Ergebnis einer umfangreichen Berechnung speichern und bei nachfolgenden Aufrufen schnell zurückgeben, um die Leistung zu optimieren und wertvolle Verarbeitungszeit zu sparen.
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
Benutzerdefinierte Kontextmanager
Wenn du einen Kontextmanager mit den Methoden __enter__
und __exit__
aufbaust, kannst du die Ressourcenverwaltung automatisieren. Du kannst zum Beispiel einen benutzerdefinierten Kontextmanager entwerfen, der Dateivorgänge abwickelt - also eine Datei öffnet, wenn du einen Block betrittst, und sicherstellt, dass sie geschlossen wird, wenn du ihn verlässt. Das vereinfacht deinen Code und verhindert häufige Fehler wie Ressourcenlecks.
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)
Benutzerdefinierte Iterables und Container
Damit deine benutzerdefinierten Container mit den Schleifen und Comprehensions von Python funktionieren, implementiere das Iterationsprotokoll, indem du Methoden wie __iter__
und __next__
definierst . Egal, ob du einen benutzerdefinierten Stapel, eine Warteschlange oder einen anderen Container baust, mit diesen Methoden kannst du deine Objekte wie eine normale Liste in einer Schleife durchlaufen und so die Flexibilität und Benutzerfreundlichkeit deiner Klassen erhöhen.
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
Mehr über benutzerdefinierte Iterables und das Verhalten von Containern erfährst du im Python Lists Tutorial und im Python List Functions & Methods Tutorial and Examples.
Best Practices mit Dunder-Methoden
Wann und wie man Dunder-Methoden außer Kraft setzt, ist wichtig. Hier sind einige Richtlinien, die du beachten solltest:
Wann du dich überstimmen lässt
Überschreibe dunder Methoden nur, wenn du das Verhalten anpassen musst. Wenn du zum Beispiel möchtest, dass deine Objekte Arithmetik oder Gleichheitsprüfungen auf eine bestimmte Art und Weise unterstützen, dann lohnt es sich, Methoden wie __add__
oder __eq__
zu implementieren.
Konsistenz
Wenn du eine Methode überschreibst, z. B. __eq__
für Gleichheitsprüfungen, aktualisiere verwandte Methoden wie __hash__
entsprechend. Diese Konsistenz stellt sicher, dass sich deine Objekte in Sammlungen wie Sets oder Wörterbüchern korrekt verhalten.
Übermäßige Nutzung vermeiden
Widerstehe der Versuchung, neue Donnernamen außerhalb des Standard-Python-Datenmodells zu erstellen. Wenn du dich an den eingebauten Satz von Dunder-Methoden hältst, bleibt dein Code übersichtlich und verhindert unerwartetes Verhalten.
Überlegungen zur Leistung
Bedenke, dass das Überschreiben von Dunder-Methoden, besonders in häufig ausgeführten Teilen deines Codes, die Leistung beeinträchtigen kann. Strebe effiziente Implementierungen an, um Verlangsamungen bei hochfrequenten Vorgängen zu vermeiden.
Fazit und weitere Ressourcen
Die Dunder-Methoden ermöglichen es deinen Python-Klassen, nahtlos mit den eingebauten Funktionen der Sprache zu interagieren, sodass dein Code sauberer und intuitiver wird. Sie ermöglichen es deinen Objekten, alles von Arithmetik und Vergleichen bis hin zur Verwaltung von benutzerdefinierten Attributen ohne zusätzlichen Aufwand für dich zu erledigen. Du solltest mit diesen Methoden in deinen Projekten experimentieren und sehen, wie sie komplexe Vorgänge vereinfachen können.
Ausführlichere Informationen findest du in der offiziellen Python-Dokumentation zum Datenmodell. Du wirst auch unsere DataCamp-Ressourcen hilfreich finden:
- Lernpfad Python-Entwickler/in - Verbessere deine Python-Kenntnisse insgesamt.
- Einführung in Python - Ein guter Startpunkt, um die Grundlagen von Python zu lernen.
- Python Lists Tutorial - Tauche ein in Datenstrukturen und lerne mehr über die mächtigen eingebauten Typen von Python.
- Python lambda Tutorial - Entdecke die funktionale Programmierung in Python.
Technischer Redakteur, der sich auf KI, ML und Datenwissenschaft spezialisiert hat und komplexe Ideen verständlich und nachvollziehbar macht.
Lerne Python mit DataCamp
Kurs
Introduction to Python for Developers
Kurs
Cluster Analysis in Python

Der Blog
Lehrer/innen und Schüler/innen erhalten das Premium DataCamp kostenlos für ihre gesamte akademische Laufbahn
Der Blog
Q2 2023 DataCamp Donates Digest
Der Blog
2022-2023 DataCamp Classrooms Jahresbericht
Der Blog
Die 50 besten AWS-Interview-Fragen und Antworten für 2025
Der Blog
Die 20 besten Snowflake-Interview-Fragen für alle Niveaus

Nisha Arya Ahmed
15 Min.
Der Blog
Top 30 Generative KI Interview Fragen und Antworten für 2024

Hesam Sheikh Hassani
15 Min.