Magische Methoden in Python, zum Beispiel

Bild mit freundlicher Genehmigung von www..com

Ändern des integrierten Verhaltens mit magischen Methoden

Magische Methoden sind spezielle Methoden, die Sie definieren können, um Ihren Klassen „Magie“ hinzuzufügen. Sie sind immer von doppelten Unterstrichen umgeben, z. B. die magischen Methoden __init__ und __str__. Magische Methoden können unser Klassendesign bereichern, indem sie uns Zugriff auf die integrierten Syntaxfunktionen von Python gewähren.

Python lässt unsere Klassen von eingebauten Klassen erben. Eine vererbende untergeordnete Klasse eines Built-Ins teilt dieselben Attribute, einschließlich Methoden wie das Built-in. Wir können die integrierten Kernfunktionen nutzen, ausgewählte Vorgänge jedoch mithilfe magischer Methoden anpassen.

In diesem Tutorial werde ich diese beiden Ideen miteinander verknüpfen, um zu zeigen, wie wir von der integrierten List-Klasse erben und magische Methoden in unserem Klassendesign verwenden können. Ich werde die drei magischen Methoden ändern, die die Listenindexierung steuern. Durch die Kombination dieser beiden Funktionen kann eine Klasse erstellt werden, die sehr einfach zu verwenden ist, und wir können den gewünschten Methoden Verhalten hinzufügen. Eingebautes Verhalten ist allen Python-Entwicklern vertraut; Dies wiederum macht die Verwendung unserer Vererbungsklasse leicht zu erlernen.

Schließlich werden zwei weitere breitere Beispiele gezeigt, die veranschaulichen, wie magische Methoden bei Broadcast-Operationen und beim Ändern des Zustands einer Instanz verwendet werden können. Der gesamte dazugehörige Code ist über GitHub verfügbar.

Beispiel 1: Listenindizierung

Magische Methoden können manipuliert werden, um die Listenindizierung zu ändern. Die Klasse MyCustomList erbt vom integrierten Listentyp. Dies bedeutet, dass sich jedes Objekt, das über die MyCustomList-Klasse erstellt wird, wie eine Liste verhält, außer an den Stellen, an denen wir Methoden selektiv anpassen.

getitem, setitem und delitem sind magische Methoden, die aufgerufen werden, wenn wir auf den Listenindex zugreifen. Das Verhalten dieser magischen Methoden kann geändert werden.

In dem unten gezeigten Beispiel verwerfen wir die Idee der Listenindexierung, die am Nullenindex beginnt. Wenn der Benutzer versucht, mit dem Nullindex auf ein Element aus unserer Liste zuzugreifen, wird eine ValueError-Ausnahme ausgelöst und das Programm beendet. Wenn der Benutzer einen Listenindex größer als eins eingibt, reduzieren die Methoden den Index um eins und rufen dann die übergeordnete Klassenliste mit dem Index auf.

Um zu zeigen, wie diese in der MyCustomList-Klasse definierten Methoden verwendet werden, siehe unten in der interaktiven Python-Eingabeaufforderung.

Das Beispiel zeigt wie getitem, setitem und delitem aufgerufen werden können. Magische Methoden können implizit aufgerufen werden. Um für __getitem__ auf den ersten Index zuzugreifen, schreiben Sie einfach den Namen des Objekts gefolgt von der Indexposition in eckige Klammern.

Am interessantesten ist, dass, wenn wir nach dem Element an der Indexposition 1 fragen, der ganzzahlige Wert 1 zurückgegeben wird, obwohl 1 das nullte Element ist. Was wir hier haben, ist eine Liste, deren Indizierung bei 1 beginnt. Tatsächlich gleicht es die Verwirrung aus, die wir alle hatten, als wir die Listenindizierung zum ersten Mal lernten.

Nun ändern wir den Integer-Wert 1 in der Liste auf 100. Dazu müssen wir setitem aufrufen. Dazu schreiben wir einfach den Namen des Objekts, gefolgt von eckigen Klammern und einer Zuweisung. Um das erste Element in der Liste zu ändern, verwenden wir erneut die Indexposition 1. Wenn wir die Liste erneut ausgeben, können wir deutlich sehen, dass sich das erste Element von 1 zu 100 geändert hat.

Schließlich kann zum Löschen eines Elements aus der Liste __delitem__ definiert werden. Die magische Methode __delitem__ wird aufgerufen, wenn wir das Schlüsselwort del python verwenden, das in den Methodenaufruf __delitem__ . Um unser Listenindexierungsbeispiel weiter auszubauen, löschen wir das erste Element im Index, den ganzzahligen Wert 100. Wenn wir del aufrufen, gefolgt vom Objekt und der Indexposition des Elements, das wir löschen möchten, in diesem Beispiel das erste Element in der Liste 100, können wir jetzt sehen, dass 100 tatsächlich entfernt wurde!

Magische Methoden bieten die Möglichkeit, das Standardverhalten zu ändern. Das Beste ist, dass keine neuen Methodennamen oder eine neue Schnittstelle gelernt werden müssen, sodass die Methoden intuitiv implementiert werden können. Eine Anleitung zur Verwendung dieser in MyCustomList implementierten magischen Methoden finden Sie in der folgenden Tabelle.

How to call the magic methods, getitem, setitem and delitem

Example 2: Die __mul__ magische Methode

Wir können auch den Multiplikationsoperator in unserem Klassendesign verwenden. Da wir von der integrierten Listenklasse erben, können wir zwei MyCustomList-Objekte zusammen komprimieren (da sie sich wie Listenobjekte verhalten) und das zip-Objekt durchlaufen. Während der Iterationen können wir die Elemente in jeder Liste auf Broadcast-Weise mit dem entsprechenden Element in der anderen Liste multiplizieren (siehe __mul__ magic method Code Snippet unten). Dieses Broadcast-Verhalten ähnelt dem in Datenanalysepaketen wie Pandas und Numpy.

Das Beispiel zeigt, dass wir zwei MyCustomList Objekte mit dem Zeichen * zusammenfügen können. Wenn wir den zurückgegebenen Wert in einer Variablen namens list_three erfassen und list_three drucken, wird eine neue Liste ausgegeben. Diese Liste ist das Produkt der Multiplikation der Elemente gegeneinander aus den anderen 2 Listen.

__mul__ ist eine Methode aus der MyCustomList Klasse. Hier wird es isoliert gezeigt.

Der Multiplikationsoperator * wird in einen magischen Methodenaufruf __mul__ aufgelöst, den wir anpassen können, um das gewünschte Verhalten zurückzugeben.

Der gesamte Quellcode für die in diesem Beispiel verwendete Klasse MyCustomList ist unten dargestellt:

Beispiel Bonus: Die __call__ Magic-Methode

Zum Abschluss werde ich veranschaulichen, wie die __call__ magic-Methode in Python aufgerufen werden kann. __call__ kann besonders nützlich in Klassen mit Instanzen sein, die häufig ihren Status ändern müssen. Das „Aufrufen“ der Instanz kann eine intuitive und elegante Möglichkeit sein, den Status des Objekts zu ändern.

Betrachten Sie das gezeigte Beispiel. Hier verfügt die Klasse MyClass über einen init Konstruktor, der drei übergebene Argumente erwartet. Diese drei Argumente können in der init-Methodensignatur übergeben und als Attribute im Objekt zugewiesen werden.

Die call Magic-Methode ist nützlich, wenn wir den Status einer Instanz ändern möchten, ohne tatsächlich eine neue Instanz zu erstellen.

Wenn die Instanz zum ersten Mal initialisiert wird, übergebe ich die Ganzzahlen 1, 2 und 3, die in der Instanz jeweils als Attribute var_1, var_2 und var_3 zugewiesen sind. Wenn ich die print Anweisung verwende, um die Ausgabe der Instanz obj mithilfe des __dict__ Attributs __dict__ , kann ich sehen, dass var_1 der Wert 1 , var_2 der Wert 2 und var_3 der Wert 3 .

Nun schlagen wir vor, dass ich die Attributwerte var_1 und var_2 dieser Instanz ändern möchte, während ich das Attribut var_3 so behalte, wie es war, als die Instanz ursprünglich erstellt wurde.

Dies zu tun ist einfach. Ich definiere eine Callback-Methode, mit der die Attribute var_1 und var_2 neu definiert werden können. Magische Methoden können implizit aufgerufen werden, was bedeutet, dass ich einfach obj(200, 300) aufrufe und die Aufrufmethode aufgerufen wird. Natürlich ist es auch möglich, die Aufrufmethode explizit aufzurufen, z. B. obj .__call__(200, 300), aber die erste Methode scheint intuitiver zu sein. Schließlich habe ich zu Demonstrationszwecken die ID der Instanz gedruckt, um definitiv zu zeigen, dass wir dasselbe Objekt manipuliert haben.

Die Aufrufmethode kann auf zwei Arten definiert werden. Die Argumente können entweder direkt in die Aufrufmethodensignatur übergeben werden. Alternativ kann das Argument *vars verwendet werden, das alle übergebenen Argumente erfasst und in einem Tupel speichert, das wie oben gezeigt entpackt werden kann.

Der Quellcode für dieses Beispiel finden Sie unten.

Zusammenfassung

Magische Methoden können unser Klassendesign bereichern, indem sie uns Zugriff auf grundlegende Syntaxfunktionen gewähren. In den ersten Beispielen haben wir das Beste aus beiden Welten. Wir können von der integrierten Listenklasse erben und bestimmte Methoden in dieser Klasse ändern, um das Verhalten anzupassen. getitem, setitem und delitem wurden alle geändert, aber durch Vererbung konnten wir immer noch die in der Liste integrierten Methoden init und repr () verwenden.

Wir können die Verwendung der Objekte extrem einfach an andere Entwickler kommunizieren. In dem bereitgestellten Beispiel müssen wir unseren Mitentwicklern nur sagen, dass sich unsere Klasse wie eine Liste verhält, nur ein wenig anders, hier verwerfen wir die Idee eines Nullenindex. Es gibt keine Notwendigkeit, neue Methoden Namen oder eine neue Schnittstelle zu lernen.

Zusätzlich wurde die call Magic Methode demonstriert. Das Aufrufen der Instanz kann eine intuitive und elegante Möglichkeit sein, den Status des Objekts zu ändern.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.