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.
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
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