Comment créer une instance d'une classe particulière à partir de dict en utilisant __new__ () en python

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.

Comment créer une instance normale

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)

Conversion depuis dict

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)

«Personne (** d)» n'est-il pas suffisant?

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)

Détails

__new__ () est utilisé pour créer un objet lorsque la classe est utilisée comme objet appelable.

  1. Créez un objet avec __new__ ()
  2. Initialisez l'objet avec __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.

Mise en garde

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

Comment créer une instance d'une classe particulière à partir de dict en utilisant __new__ () en python
Créer une instance d'une classe prédéfinie à partir d'une chaîne en Python
Différentes façons de créer un tableau de nombres de 1 à 10 en Python.
Comment créer un fichier JSON en Python
Comment générer un nouveau groupe de journaux dans CloudWatch à l'aide de python dans Lambda
Comment obtenir la valeur du magasin de paramètres dans lambda (en utilisant python)
[Python] [Word] [python-docx] Essayez de créer un modèle de phrase de mot en Python en utilisant python-docx
[Python] Comment trier un dict dans une liste et une instance dans une liste
Comment créer un téléchargeur d'image avec Bottle (Python)
Comment exécuter une commande à l'aide d'un sous-processus en Python
[GCF + Python] Comment importer Excel vers GCS et créer une nouvelle table dans BigQuery
Comment créer un profil radial à partir d'images astronomiques (Chandra, XMM etc.) en utilisant python
Comment utiliser NUITKA-Utilities hinted-compilation pour créer facilement un fichier exécutable à partir d'un script Python
Ne prenez pas une instance d'une classe d'exception Python directement comme argument de la classe d'exception!
Comment découper un bloc de plusieurs tableaux à partir d'un multiple en Python
Comment utiliser la méthode __call__ dans la classe Python
Comment développer dans un environnement virtuel Python [Memo]
Comment obtenir une liste d'exceptions intégrées pour python
Un mémo pour générer des variables dynamiques de classe à partir de données de dictionnaire (dict) qui n'ont que des données de type standard en Python3
Comment compter rapidement la fréquence d'apparition des caractères à partir d'une chaîne de caractères en Python?
[Python] Comment créer une table à partir d'une liste (opération de base de création de table / changement de nom de matrice)
Comment déterminer l'existence d'un élément sélénium en Python
Comment connaître la structure interne d'un objet en Python
Comment transformer une chaîne en tableau ou un tableau en chaîne en Python
Comment vérifier la taille de la mémoire d'une variable en Python
Comment obtenir une chaîne à partir d'un argument de ligne de commande en python
Comment vérifier la taille de la mémoire d'un dictionnaire en Python
Comment créer une grande quantité de données de test dans MySQL? ??
Comment créer un clone depuis Github
[Introduction à Python] Comment utiliser la classe en Python?
[Python] Comment rendre une classe itérable
Comment obtenir stacktrace en python
Comment utiliser __slots__ dans la classe Python
Générer une classe à partir d'une chaîne en Python
Comment créer un référentiel à partir d'un média
Comment envoyer une image visualisée des données créées en Python à Typetalk
Créez un outil qui secoue automatiquement furigana avec html en utilisant Mecab de Python3
[Python] Comment mettre n'importe quel nombre d'entrées standard dans la liste
Je veux colorer une partie de la chaîne Excel avec Python
Comment bien formater une liste de dictionnaires (ou d'instances) en Python
Tutoriel "Cython" pour rendre Python explosif: Comment analyser la classe Enum définie en code C ++ vers Enum en Python.
Modifier Excel à partir de Python pour créer un tableau croisé dynamique
Créer un fichier GIF en utilisant Pillow en Python
Comment ouvrir un navigateur Web à partir de python
Comment effacer un taple dans une liste (Python)
Comment créer un objet fonction à partir d'une chaîne
Résumé de la façon d'importer des fichiers dans Python 3
Je veux créer une fenêtre avec Python
Créer une nouvelle tâche Todoist à partir d'un script Python
Comment générer un objet Python à partir de JSON
Résumé de l'utilisation de MNIST avec Python
Comment notifier les canaux Discord en Python
Créer une nouvelle page en confluence avec Python
Créer un objet datetime à partir d'une chaîne en Python (Python 3.3)
[Python] Comment dessiner un histogramme avec Matplotlib
Comment créer une API Rest dans Django
Créez un fichier MIDI en Python en utilisant pretty_midi
Comment passer le résultat de l'exécution d'une commande shell dans une liste en Python