Vous pourrez peut-être créer une instance d'une classe particulière à partir de dict en utilisant __new__ ()
en python. Cela peut être pratique de temps en temps. Comment contourner le paramètre «__init __ ()» défini et créer une instance.
On suppose que la classe suivante est définie.
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)
Normalement, la valeur est transmise comme argument direct et initialisée comme indiqué ci-dessous.
p = Person("foo", 20)
print(p)
# Person(foo, 20)
Si vous souhaitez créer une instance à partir de dict, vous pouvez l'écrire comme ceci.
d = {"name": "foo", "age": 20}
p = Person.__new__(Person)
p.__dict__.update(d)
print(p)
Person(foo, 20)
Dans le cas de l'exemple précédent, Person (** d)
peut également être utilisé pour créer une instance à l'aide de données dict. Est-ce assez?
Ce n'est parfois pas le cas. Par exemple, lors de la création de données de test, vous souhaiterez peut-être l'initialiser directement avec la valeur calculée. Une situation où init () est défini dans une telle classe avec divers calculs dérangeants, et vous souhaitez contourner les calculs et spécifier une valeur directe pour initialiser l'instance.
class X(object):
def __init__(self, d):
self.y = foo(d)
self.z = boo(d)
__new__ ()
est utilisé pour créer un objet lorsque la classe est utilisée comme objet appelable.
__new__ ()
__init __ ()
De plus, la variable d'instance de l'objet elle-même est stockée dans self .__ dict__
. Par conséquent, on peut dire que seul l'objet est créé par __new__ ()
et que __dict __
est mis à jour ultérieurement.
Bien sûr, notez que «__init __ ()» n'est pas appelé.
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