Générer une classe à partir d'une chaîne en Python

Lorsque je veux qu'un script fasse quelque chose, je sors généralement du fichier de configuration, j'y agrège les paramètres et je charge cette configuration lorsque je l'exécute. Parmi les valeurs de réglage, il y a eu des moments où je voulais exécuter un certain processus dans une classe spécifique. Que dois-je faire dans un tel cas? Souhaitez-vous écrire des paramètres tels que des valeurs numériques et générer des classes en les divisant par if minutes dans le code, par exemple, ClassA pour 1 et ClassB pour 2? Si vous avez besoin d'un nouveau modèle de classe C, vous devez ajouter la partie if du code. Avec python, vous pouvez utiliser globals () pour créer un objet de classe à partir d'une chaîne, ce qui est pratique dans de tels cas.

(mise à jour) Comme mentionné dans le commentaire, la fonction eval peut également créer un objet de classe à partir d'une chaîne.

globals() Ceci peut être réalisé en utilisant la fonction globals (). globals () renvoie un dictionnaire des modules actuellement chargés. Vous pouvez l'utiliser pour générer une classe à partir d'une chaîne.

Exemple de code

Ceci est un exemple de code.

parent_child.py


#Classe parent
class Parent(object):
  def __init__(self):
    pass

  def call(self):
    print("I am parent.")

#Classe enfant 1
class ChildAsBrother(Parent):
  def __init__(self):
    super().__init__()

  def call(self):
    print("I am child as brother.")

#Classe enfant 2
class ChildAsSister(Parent):
  def __init__(self):
    super().__init__()

  def call(self):
    print("I am child as sister.")

#Création et appel d'objets normaux
obj = Parent()
obj.call()

obj = ChildAsBrother()
obj.call()

# globals()Génération d'objets avec
obj = globals()["ChildAsSister"]()     # <---Les objets peuvent être créés à partir de chaînes
obj.call()

#ajouter à
#Méthode utilisant eval
obj = eval("ChildAsSister")()
obj.call()

obj = eval("ChildAsSister()")
obj.call()

Le résultat de l'exécution sera comme ça.

I am parent.
I am child as brother.
I am child as sister.
I am child as sister.
I am child as sister.

De cette façon, vous pouvez spécifier le nom de la classe que vous souhaitez utiliser dans le fichier de configuration et l'utiliser directement dans votre code. C'est pratique

En premier lieu, globals () ...

Que renvoie exactement globals () en premier lieu? Je l'ai vérifié pendant un moment. Je vais le présenter ici pour votre référence.

print(globals())

#En fait, il est affiché sur une seule ligne, mais il est difficile à voir, donc il est cassé.
{'__name__': '__main__', 
'__doc__': None, 
'__package__': None, 
'__loader__': <_frozen_importlib_external.SourceFileLoader object at 0xffdc5c90>, 
'__spec__': None, 
'__annotations__': {}, 
'__builtins__': <module 'builtins' (built-in)>, 
'__file__': 'parent_child.py', 
'__cached__': None, 
'Parent': <class '__main__.Parent'>, 
'ChildAsBrother': <class '__main__.ChildAsBrother'>, 
'ChildAsSister': <class '__main__.ChildAsSister'>, 
'obj': <__main__.ChildAsSister object at 0xffd18b90>}

Je ne connais pas les détails, mais il semble que les métadonnées, les classes et les objets dans l'environnement d'exécution sont gérés. Il semble que la classe qu'il contient fonctionne.

Recommended Posts

Générer une classe à partir d'une chaîne en Python
Générer une collection de première classe en Python
Créer une instance d'une classe prédéfinie à partir d'une chaîne en Python
Créer un objet datetime à partir d'une chaîne en Python (Python 3.3)
Django: Importer une classe depuis une chaîne
Créer une chaîne aléatoire en Python
Générer un langage C à partir d'une expression S avec Python
Comment obtenir une chaîne à partir d'un argument de ligne de commande en python
classe de cas en python
Manipulation de chaîne en python
Notation de classe en Python
Comment incorporer des variables dans des chaînes python
J'ai écrit une classe en Python3 et Java
Comment générer un objet Python à partir de JSON
Appel de scripts Python à partir de Python intégré en C ++ / C ++
Sortie d'une courte chaîne de caractères de type URL en Python
Insérer un objet dans une chaîne en Python
Vérifiez si la chaîne est un nombre en python
Prendre une capture d'écran en Python
Analyser une chaîne JSON écrite dans un fichier en Python
Comment convertir / restaurer une chaîne avec [] en python
Je souhaite intégrer une variable dans une chaîne Python
Générer une vignette arrondie en Python
Créer une fonction en Python
Créer un dictionnaire en Python
Convertir le fuseau horaire de la date (décalage horaire) avec Python (à partir de la chaîne)
Recevez des données de dictionnaire à partir de programmes Python avec AppleScript
[Python] Utiliser une séquence de chaînes
OCR à partir de PDF en Python
[Python] Comment développer des variables dans une chaîne de caractères
Générer une distribution U en Python
Créer un bookmarklet en Python
Générer du code QR en Python
Manipulation de la date des chaînes en Python
Dessinez un cœur en Python
Générez 8 * 8 (64) cubes avec Blender Python
Générez Word Cloud à partir de données de cas d'essai avec python3
Comment découper un bloc de plusieurs tableaux à partir d'un multiple en Python
Comment utiliser la méthode __call__ dans la classe Python
[MQTT / Python] Implémentation d'une classe qui fait Pub / Sub de MQTT en Python
J'ai créé une classe en Python et essayé de taper du canard
Python> Lire à partir d'une chaîne multiligne au lieu d'un fichier> io.StringIO ()
Probablement dans un serpent Nishiki (Titre original: Peut-être en Python)
Ecrire une dichotomie en Python
[python] Gérer les fonctions dans une liste
Toucher les objets Python d'Elixir
Appuyez sur une commande en Python (Windows)
[Python] Générer un code QR en mémoire
Obtenir des données de Quandl en Python
Créer un conteneur DI avec Python
Créez un Dataframe pandas à partir d'une chaîne.
Dessinez une matrice de diagramme de dispersion avec python
ABC166 en Python A ~ C problème
Générer le notebook Jupyter ".ipynb" en Python
Ecrire des algorithmes A * (A-star) en Python
Lire des morceaux PNG en Python (édition de classe)
Créer un fichier binaire en Python
python / Créer un dict à partir d'une liste.
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