Anonyme Objekte in Python
-
Erstellen Sie anonyme Objekte mit der Klasse
namedtuple
in Python -
Erstellen Sie anonyme Objekte mit der Funktion
type()
in Python
In diesem Tutorial werden die Methoden zum Erstellen anonymer Objekte in Python erläutert.
Erstellen Sie anonyme Objekte mit der Klasse namedtuple
in Python
Ein anonymes Objekt ist nur ein Wert ohne echten Namen. Daher heißt es anonym.
Manchmal ist es einfacher, ein anonymes Objekt zum Halten von Werten zu erstellen, als eine ganz neue Klasse zu definieren.
Standardmäßig unterstützt die Programmiersprache Python im Gegensatz zu C# und Java keine anonymen Klassen. Aber mit ein wenig Kreativität können wir eine Problemumgehung finden und die Funktionalität anonymer Objekte nachahmen.
Für den Anfang können wir die namedtuple
-Klasse im collections
-Modul von Python verwenden, um anonyme Objekte nachzuahmen. Der folgende Code zeigt, wie wir anonyme Objekte mit der Python-Klasse namedtuple
erstellen können.
from collections import namedtuple
anonymousClass = namedtuple("variables", ["foo", "woo", "boo"])
obj1 = anonymousClass(foo=1, woo=2, boo="3")
obj1.boo
Ausgang:
'3'
Wir haben zuerst das benannte Tupel anonymousClass
mit namedtuple("variables", ['foo', 'woo', 'boo']
initialisiert. Im Konstruktor haben wir ein Schlüssel/Wert-Paar übergeben, bei dem der Wert eine Liste von ist Variablennamen, in denen wir unsere temporären Werte speichern.
In unserem Anwendungsfall hat alles, was wir als Schlüssel des Konstruktors übergeben, keine großen Auswirkungen auf unser Ergebnis. Wir können nun dieses anonymousClass
-Objekt verwenden, um anonyme Objekte mit obj1 = anonymousClass(foo=1, woo=2, boo='3')
zu erstellen.
Das Gute an dieser Methode ist, dass das Objekt anonymousClass
wiederverwendbar ist und wir beliebig viele anonyme Objekte erstellen können. Der Hauptnachteil dieses Ansatzes besteht darin, dass wir die Anzahl der Variablen kennen müssen, während wir das namedtuple
initialisieren.
Erstellen Sie anonyme Objekte mit der Funktion type()
in Python
Eine andere Möglichkeit, ein anonymes Objekt zu deklarieren, ist die Funktion type()
in Python. Die Funktion type()
benötigt 3 Parameter; der Name des neuen Datentyps, der Datentyp der darin enthaltenen Werte und eine Reihe von Werten.
Das folgende Code-Snippet zeigt, wie wir das Verhalten von anonymen Objekten mit der Funktion type()
in Python nachahmen können.
obj = type("", (object,), {"foo": 1, "woo": 2, "boo": "3"})()
obj.boo
Ausgang:
'3'
Im obigen Code haben wir dem ersten Parameter der Funktion type()
einen leeren String übergeben, der dem Namen des neuen Datentyps entspricht. Der zweite Parameter ist der als object
spezifizierte Datentyp.
Der dritte Parameter ist ein Satz von Werten, die in Schlüssel/Wert-Paaren angegeben werden, wobei der Schlüssel der Name der Variablen und der Wert der entsprechende Wert ist. Im Vergleich zu unserem bisherigen Ansatz hat dieser Ansatz seine Vor- und Nachteile.
Der offensichtliche Nachteil hier ist, dass wir das obj
nicht wiederverwenden können, um anonymere Objekte zu initialisieren, anders als die anonymousClass
im vorherigen Beispiel. Der Vorteil dieses Ansatzes besteht darin, dass wir mehr Variablen angeben können, ohne sie zuerst zu deklarieren.
Diese type()
-Funktion kann modifiziert werden, um neue Werte aufzunehmen, ohne zuerst ihren Namen anzugeben, indem dict
anstelle des object
-Datentyps verwendet wird. Das folgende Code-Snippet zeigt uns die Funktionsweise dieser Methode.
obj3 = type("", (dict,), {"foo": 1, "woob": 2})()
obj3.boo = 123
obj3.boo
Ausgang:
123
Im obigen Code haben wir das object
aus dem vorherigen Beispiel durch dict
ersetzt.
Beide oben diskutierten Methoden haben ihre Vor- und Nachteile gegenüber einander. Keiner von ihnen ist ein klarer Gewinner, und welcher davon abhängt, hängt von unserem Anwendungsfall ab.
Wenn wir bereits die Anzahl der Werte kennen, die wir am Ende speichern werden, Sie aber mehrere anonyme Objekte benötigen, würde die Methode namedtuple
besser funktionieren. Wenn wir die Anzahl der Werte nicht kennen, aber nur ein oder zwei anonyme Objekte benötigen, wäre die Methode type()
besser.
Maisam is a highly skilled and motivated Data Scientist. He has over 4 years of experience with Python programming language. He loves solving complex problems and sharing his results on the internet.
LinkedIn