Geekflare wird von unserem Publikum unterstützt. Es kann sein, dass wir durch den Kauf von Links auf dieser Seite Affiliate-Provisionen verdienen.
Unter Entwicklung Zuletzt aktualisiert: September 23, 2023
Weitergeben:
Invicti Web Application Security Scanner - die einzige Lösung, die eine automatische Überprüfung von Schwachstellen mit Proof-Based Scanning™ ermöglicht.

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

993shots_so

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:

NameMethodeZeichenBeschreibung
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

293shots_so

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.

NameMethodeVorzeichenBeschreibung
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

739shots_so

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:

NameMethodeBeschreibung
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

44shots_so
NameMethodeBeschreibung
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.

  • Anesu Kafesu
    Autor
    Full-Stack-Webentwickler und technischer Redakteur. Lernt derzeit KI.
Dank an unsere Sponsoren
Weitere gute Lektüre zum Thema Entwicklung
Energie für Ihr Unternehmen
Einige der Tools und Dienste, die Ihr Unternehmen beim Wachstum unterstützen.
  • Invicti nutzt das Proof-Based Scanning™, um die identifizierten Schwachstellen automatisch zu überprüfen und innerhalb weniger Stunden verwertbare Ergebnisse zu erzielen.
    Versuchen Sie Invicti
  • Web Scraping, Residential Proxy, Proxy Manager, Web Unlocker, Search Engine Crawler und alles, was Sie zum Sammeln von Webdaten benötigen.
    Versuchen Sie Brightdata
  • Monday.com ist ein All-in-One-Betriebssystem, mit dem Sie Projekte, Aufgaben, Arbeit, Vertrieb, CRM, Arbeitsabläufe und vieles mehr verwalten können.
    Versuch Montag
  • Intruder ist ein Online-Schwachstellen-Scanner, der Schwachstellen in Ihrer Infrastruktur aufspürt, um kostspielige Datenschutzverletzungen zu vermeiden.
    Versuchen Sie Intruder