Direkt zum Inhalt

Python Dunder Methoden: Besondere Befehle, die man kennen sollte

Lerne, wie die doppelten Unterstriche in Python es deinen eigenen Objekten ermöglichen, auf natürliche Weise mit den eingebauten Operationen zusammenzuarbeiten, vom Drucken bis zum Rechnen. Entdecke, wie diese magischen Methoden das Klassendesign vereinfachen und mächtige Verhaltensweisen freischalten.
Aktualisierte 11. Apr. 2025  · 8 Min. Lesezeit

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:


Oluseye Jeremiah's photo
Author
Oluseye Jeremiah
LinkedIn

Technischer Redakteur, der sich auf KI, ML und Datenwissenschaft spezialisiert hat und komplexe Ideen verständlich und nachvollziehbar macht.

Themen

Lerne Python mit DataCamp

Kurs

Intermediate Python

4 hr
1.2M
Level up your data science skills by creating visualizations using Matplotlib and manipulating DataFrames with pandas.
Siehe DetailsRight Arrow
Kurs starten
Mehr anzeigenRight Arrow
Verwandt

Der Blog

Lehrer/innen und Schüler/innen erhalten das Premium DataCamp kostenlos für ihre gesamte akademische Laufbahn

Keine Hacks, keine Tricks. Schüler/innen und Lehrer/innen, lest weiter, um zu erfahren, wie ihr die Datenerziehung, die euch zusteht, kostenlos bekommen könnt.
Nathaniel Taylor-Leach's photo

Nathaniel Taylor-Leach

4 Min.

Der Blog

Q2 2023 DataCamp Donates Digest

DataCamp Donates hat im zweiten Quartal 2023 über 20.000 Stipendien an unsere gemeinnützigen Partner vergeben. Erfahre, wie fleißige benachteiligte Lernende diese Chancen in lebensverändernde berufliche Erfolge verwandelt haben.
Nathaniel Taylor-Leach's photo

Nathaniel Taylor-Leach

Der Blog

2022-2023 DataCamp Classrooms Jahresbericht

Zu Beginn des neuen Schuljahres ist DataCamp Classrooms motivierter denn je, das Lernen mit Daten zu demokratisieren. In den letzten 12 Monaten sind über 7.650 neue Klassenzimmer hinzugekommen.
Nathaniel Taylor-Leach's photo

Nathaniel Taylor-Leach

8 Min.

Der Blog

Die 50 besten AWS-Interview-Fragen und Antworten für 2025

Ein kompletter Leitfaden zur Erkundung der grundlegenden, mittleren und fortgeschrittenen AWS-Interviewfragen, zusammen mit Fragen, die auf realen Situationen basieren.
Zoumana Keita 's photo

Zoumana Keita

15 Min.

Der Blog

Die 20 besten Snowflake-Interview-Fragen für alle Niveaus

Bist du gerade auf der Suche nach einem Job, der Snowflake nutzt? Bereite dich mit diesen 20 besten Snowflake-Interview-Fragen vor, damit du den Job bekommst!
Nisha Arya Ahmed's photo

Nisha Arya Ahmed

15 Min.

Der Blog

Top 30 Generative KI Interview Fragen und Antworten für 2024

Dieser Blog bietet eine umfassende Sammlung von Fragen und Antworten zu generativen KI-Interviews, die von grundlegenden Konzepten bis hin zu fortgeschrittenen Themen reichen.
Hesam Sheikh Hassani's photo

Hesam Sheikh Hassani

15 Min.

Mehr anzeigenMehr anzeigen