Eine der weniger bekannten, aber wertvollen Funktionen von Python ist die Möglichkeit, magische Methoden für Objekte zu implementieren. Mit magischen Methoden können wir sauberen Code schreiben, der intuitiv und leicht zu verstehen ist.
Mit magischen Methoden können wir Schnittstellen für die Interaktion mit Objekten auf eine Weise schaffen, die sich mehr nach Python anfühlt. Dieser Artikel führt Sie in die magischen Methoden ein, erörtert die besten Methoden für ihre Erstellung und erläutert die häufigsten magischen Methoden, denen Sie begegnen werden.
Was sind magische Methoden?
Magische Methoden sind Python-Methoden, die festlegen, wie sich Python-Objekte verhalten, wenn sie mit gängigen Operationen bearbeitet werden. Diese Methoden werden eindeutig mit doppelten Unterstrichen vor und nach dem Methodennamen definiert.
Daher werden sie auch als dunder-Methoden bezeichnet, wie in doppelter Unterstrich. Eine gängige Dunder-Methode, der Sie vielleicht schon begegnet sind, ist die Methode __init__()
, die zur Definition von Klassenkonstruktoren verwendet wird.
Normalerweise sind Dunder-Methoden nicht dafür gedacht, direkt in Ihrem Code aufgerufen zu werden. Sie werden vielmehr vom Interpreter aufgerufen, während das Programm läuft.
Warum sind magische Methoden nützlich?
Magische Methoden sind ein nützliches Konzept in der objektorientierten Programmierung in Python. Mit ihnen legen Sie das Verhalten Ihrer benutzerdefinierten Datentypen fest, wenn diese mit allgemeinen, eingebauten Operationen verwendet werden. Zu diesen Operationen gehören:
🟢 Arithmetische Operationen
🟢 Vergleichsoperationen
🟢 Lebenszyklus-Operationen
🟢 Darstellungsoperationen
Im folgenden Abschnitt wird erörtert, wie man magische Methoden implementiert, die definieren, wie sich die Anwendung bei der Verwendung in allen oben genannten Kategorien verhält.
Wie man magische Methoden definiert
Wie bereits erwähnt, legen magische Methoden das Verhalten von Objekten fest. Als solche sind sie als Teil der Klasse des Objekts definiert. Da sie Teil der Objektklasse sind, nehmen sie als erstes Argument self
auf, das ein Verweis auf das Objekt selbst ist.
Je nachdem, wie sie vom Dolmetscher aufgerufen werden, können sie weitere Argumente aufnehmen. Sie sind außerdem durch zwei Unterstriche vor und nach ihren Namen eindeutig definiert.
Implementierung
Vieles von dem, was wir bisher besprochen haben, erscheint theoretisch und abstrakt. In diesem Abschnitt werden wir eine einfache Rectangle-Klasse implementieren.
Diese Klasse wird über die Eigenschaften Länge und Breite verfügen. Mit der Methode __init__ können Sie diese Eigenschaften bei der Instanziierung festlegen. Außerdem können Sie mit den Operatoren ==
, <
und >
verschiedene Rechtecke vergleichen, um festzustellen, ob sie gleich, kleiner oder größer als ein anderes Rechteck sind. Schließlich sollte das Rechteck in der Lage sein, eine aussagekräftige String-Darstellung zu liefern.
Einrichten der Codierungsumgebung
Um dieser Anleitung folgen zu können, benötigen Sie eine Python-Laufzeitumgebung. Sie können eine lokale Umgebung verwenden oder den Geekflare Python-Compiler online nutzen.
Erstellen der Klasse Rectangle
Wir beginnen mit der Definition der Klasse Rectangle.
class Rectangle:
pass
Erstellen der Konstruktormethode
Als nächstes erstellen wir unsere erste magische Methode, die Konstruktormethode der Klasse. Diese Methode nimmt die Höhe und Breite auf und speichert sie als Attribut der Klasseninstanz.
class Rectangle:
def __init__(self, height, width):
self.height = height
self.width = width
Erstellen einer magischen Methode für die String-Darstellung
Als Nächstes wollen wir eine Methode erstellen, die es unserer Klasse ermöglicht, eine für den Menschen lesbare Zeichenkette zur Darstellung des Objekts zu erzeugen. Diese Methode wird immer dann aufgerufen, wenn wir die Funktion str()
aufrufen und dabei eine Instanz der Klasse Rectangle
als Argument übergeben. Diese Methode wird auch aufgerufen, wenn Sie Funktionen aufrufen, die ein String-Argument erwarten, wie z.B. die Druckfunktion
.
class Rectangle:
def __init__(self, height, width):
self.height = height
self.width = width
def __str__(self):
return f'Rectangle({self.height}, {self.width})'
Die Methode __str__()
sollte eine Zeichenkette zurückgeben, die das Objekt repräsentieren soll. In diesem Fall geben wir einen String des Formats Rectangle(<Höhe>, <Breite>)
zurück, wobei Höhe und Breite die gespeicherten Abmessungen des Rechtecks sind.
Magische Methoden für Vergleichsoperationen erstellen
Als nächstes wollen wir Vergleichsoperatoren für die Operationen gleich, kleiner als und größer als erstellen. Dies wird als Operatorüberladung bezeichnet. Um diese zu erstellen, verwenden wir die magischen Methoden __eq__
, __lt__
und __gt__
. Diese Methoden geben einen booleschen Wert zurück, nachdem sie die Flächen der Rechtecke verglichen haben.
class Rectangle:
def __init__(self, height, width):
self.height = height
self.width = width
def __str__(self):
return f'Rectangle({self.height}, {self.width})'
def __eq__(self, other):
""" Prüfen auf Gleichheit """
return self.height * self.width == other.height * other.width
def __lt__(self, other):
""" Prüfen, ob das Rechteck kleiner ist als das andere """
return self.height * self.width < other.height * other.width
def __gt__(self, other):
""" Prüfen, ob das Rechteck größer ist als das andere """
return self.height * self.width > other.height * other.width
Wie Sie sehen können, nehmen diese Methoden zwei Parameter entgegen. Der erste ist das aktuelle Rechteck und der zweite ist der andere Wert, mit dem es verglichen wird. Dieser Wert kann eine andere Rectangle-Instanz oder ein beliebiger anderer Wert sein. Die Logik, mit der der Vergleich durchgeführt wird, und die Bedingungen, unter denen der Vergleich wahr ist, bleiben Ihnen überlassen.
Übliche magische Methoden
In diesem nächsten Abschnitt werden wir die gängigen magischen Methoden besprechen, die Sie kennen und verwenden werden.
#1. Arithmetische Operationen

Arithmetische magische Methoden werden aufgerufen, wenn eine Instanz Ihrer Klasse auf der linken Seite eines arithmetischen Zeichens platziert wird. Die Methode wird mit zwei Argumenten aufgerufen, wobei das erste ein Verweis auf die Instanz ist. Der zweite Wert ist das Objekt, das rechts vom Vorzeichen steht. Die Methoden und Vorzeichen lauten wie folgt:
Name | Methode | Zeichen | Beschreibung |
Zusatz | __add__ | Implementiert Zusatz. | |
Subtraktion | __sub__ | – | Implementiert die Subtraktion. |
Multiplikation | __mul__ | * | Implementiert die Multiplikation |
Abteilung | __div__ | / | Implementiert die Abteilung. |
Boden-Division | __flordiv__ | // | Implementiert die Bodenaufteilung. |
#2. Vergleichsoperationen

Wie die arithmetischen magischen Methoden werden diese Methoden aufgerufen, wenn sich eine Instanz der Klasse, für die sie definiert sind, links vom Vergleichsoperator befindet. Wie die arithmetischen magischen Methoden werden auch sie mit zwei Parametern aufgerufen. Der erste ist ein Verweis auf die Instanz des Objekts. Der zweite ist ein Verweis auf den Wert auf der rechten Seite des Vorzeichens.
Name | Methode | Vorzeichen | Beschreibung |
Kleiner als | __lt__ | < | Implementiert den Vergleich kleiner als |
Größer als | __gt__ | > | Implementiert den Vergleich größer als |
Gleich | __eq__ | == | Implementiert den Gleich-Vergleich |
Kleiner als oder gleich | __le__ | >= | Implementiert den Vergleich kleiner als oder gleich |
Größer als oder gleich | __ge__ | <= | Implementiert den Vergleich größer als oder gleich |
#3. Lebenszyklus-Operationen

Diese Methoden werden als Reaktion auf die verschiedenen Lebenszyklusmethoden eines Objekts aufgerufen, z.B. wenn es instanziiert oder gelöscht wird. Der Konstrukteur __init__
fällt unter diese Kategorie. Die gängigen Methoden dieser Kategorie sind in der folgenden Tabelle aufgeführt:
Name | Methode | Beschreibung |
Konstruktor | __init__ | Diese Methode wird immer dann aufgerufen, wenn ein Objekt der Klasse, für die sie definiert ist, gelöscht wird. Sie kann verwendet werden, um Aufräumaktionen durchzuführen, wie z.B. das Schließen von Dateien, die es geöffnet hatte. |
Löschung | __del__ | Diese Methode wird immer dann aufgerufen, wenn ein Objekt der Klasse, für die sie definiert ist, gelöscht wird. Sie kann verwendet werden, um Bereinigungsaktionen durchzuführen, wie z.B. das Schließen von Dateien, die es geöffnet hatte. |
Neu | __neu__ | Die Methode __new__ wird zuerst aufgerufen, wenn ein Objekt der angegebenen Klasse instanziiert wird. Diese Methode wird vor dem Konstruktor aufgerufen und nimmt die Klasse sowie alle zusätzlichen Argumente auf. Sie gibt eine Instanz der Klasse zurück. In den meisten Fällen ist sie nicht sehr nützlich, aber sie wird hier im Detail behandelt. |
#4. Operationen für die Darstellung

Name | Methode | Beschreibung |
Str | __str__ | Gibt eine für Menschen lesbare String-Darstellung des Objekts zurück. Diese Methode wird aufgerufen, wenn Sie die Funktion str() aufrufen und dabei eine Instanz der Klasse als Argument übergeben. Sie wird auch aufgerufen, wenn Sie die Instanz an die Funktionen print() und format() übergeben. Sie ist dazu gedacht, eine Zeichenkette zu liefern, die für den Endbenutzer der Anwendung verständlich ist. |
Repr | __repr__ | Gibt eine String-Darstellung des Objekts zurück, die vom Entwickler verwendet wird. Idealerweise sollte die zurückgegebene Zeichenkette so informationsreich sein, dass Sie eine identische Instanz des Objekts allein aus der Zeichenkette konstruieren können. |
Best Practices für die Erstellung von Magic-Methoden
Magische Methoden sind unglaublich und werden Ihren Code vereinfachen. Es ist jedoch wichtig, dass Sie bei der Verwendung dieser Methoden die folgenden Dinge im Auge behalten.
- Verwenden Sie sie sparsam - Wenn Sie zu viele magische Methoden in Ihren Klassen implementieren, wird Ihr Code schwer zu verstehen sein. Beschränken Sie sich darauf, nur die wichtigsten zu implementieren.
- Vergewissern Sie sich, dass Sie die Auswirkungen auf die Leistung von Methoden wie __setatrr__ und __getattr__ verstehen, bevor Sie sie verwenden.
- Dokumentieren Sie das Verhalten Ihrer magischen Methoden, damit andere Entwickler genau wissen, was sie tun. Das macht es ihnen leichter, sie zu verwenden und bei Bedarf zu debuggen.
Letzte Worte
In diesem Artikel habe ich magische Methoden als eine Möglichkeit vorgestellt, Klassen zu erstellen, die mit eingebauten Operationen verwendet werden können. Ich habe auch erörtert, wie sie definiert werden und bin ein Beispiel für eine Klasse durchgegangen, die magische Methoden implementiert hat. Als nächstes habe ich die verschiedenen Methoden erwähnt, die Sie wahrscheinlich verwenden und brauchen werden, bevor ich Ihnen einige bewährte Verfahren vorgestellt habe, die Sie im Hinterkopf behalten sollten.
Als Nächstes möchten Sie vielleicht lernen, wie man die Klasse Counter in Python implementiert.