Möglicherweise können Sie mit __new__ ()
in Python eine Instanz einer bestimmten Klasse aus dict erstellen. Es kann von Zeit zu Zeit bequem sein. So umgehen Sie das definierte __init __ ()
und erstellen eine Instanz.
Es wird angenommen, dass die folgende Klasse definiert ist.
class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return "{self.__class__.__name__}({self.name}, {self.age})".format(self=self)
Normalerweise wird der Wert als direktes Argument übergeben und wie unten gezeigt initialisiert.
p = Person("foo", 20)
print(p)
# Person(foo, 20)
Wenn Sie eine Instanz aus dict erstellen möchten, können Sie sie so schreiben.
d = {"name": "foo", "age": 20}
p = Person.__new__(Person)
p.__dict__.update(d)
print(p)
Person(foo, 20)
Im Fall des vorherigen Beispiels kann "Person (** d)" auch verwendet werden, um eine Instanz unter Verwendung von Diktatdaten zu erstellen. Ist das genug?
Manchmal ist das nicht der Fall. Wenn Sie beispielsweise Testdaten erstellen, möchten Sie möglicherweise direkt mit dem berechneten Wert initialisieren. Eine Situation, in der init () in einer solchen Klasse mit verschiedenen störenden Berechnungen definiert ist und Sie die Berechnungen umgehen und einen direkten Wert zum Initialisieren der Instanz angeben möchten.
class X(object):
def __init__(self, d):
self.y = foo(d)
self.z = boo(d)
__new__ ()
wird verwendet, um ein Objekt zu erstellen, wenn die Klasse als aufrufbares Objekt verwendet wird.
__init __ ()
Außerdem wird die Instanzvariable des Objekts selbst in "self .__ dict__" gespeichert. Daher kann gesagt werden, dass nur das Objekt von __new__ ()
erstellt wird und das __dict __
später aktualisiert wird.
Beachten Sie natürlich, dass __init __ ()
nicht aufgerufen wird.
class X(object):
def __init__(self, d):
self.x = foo(d)
self.y = boo(d)
raise RuntimeError("hmm")
x = X.__new__(X)
x.__dict__.update({"y": 10, "z": 20})
print(x, x.y, x.z)
# <__main__.X object at 0x10f7e4f28> 10 20
Recommended Posts