56 votes

Comment créer dynamiquement une instance d'une classe en python ?

Je dispose d'une liste de noms de classes et je souhaite créer leurs instances de manière dynamique, par exemple :

names=[
'foo.baa.a',
'foo.daa.c',
'foo.AA',
 ....
]

def save(cName, argument):
 aa = create_instance(cName) # how to do it?
 aa.save(argument)

save(random_from(names), arg)

Comment créer dynamiquement ces instances en Python ? Merci !

3voto

David Wood Points 98

Mon problème était que je voulais passer des arguments dans __init__ les arguments étant spécifiés dans une chaîne de caractères sur la ligne de commande. Par exemple, l'équivalent de

import a.b.ClassB as ClassB
instance = ClassB.ClassB('World')

La chaîne de la ligne de commande est la suivante "a.b.ClassB.ClassB('World')"

Avec la classe suivante dans le module a.b.ClassB

class ClassB():

    def __init__(self, name:str):
        self._name = name

    def hello(self):
        print("Hello " + self._name + "!")

nous pouvons créer cette classe avec ce qui suit

import importlib

def create_instance(class_str:str):
    """
    Create a class instance from a full path to a class constructor
    :param class_str: module name plus '.' plus class name and optional parens with arguments for the class's
        __init__() method. For example, "a.b.ClassB.ClassB('World')"
    :return: an instance of the class specified.
    """
    try:
        if "(" in class_str:
            full_class_name, args = class_name = class_str.rsplit('(', 1)
            args = '(' + args
        else:
            full_class_name = class_str
            args = ()
        # Get the class object
        module_path, _, class_name = full_class_name.rpartition('.')
        mod = importlib.import_module(module_path)
        klazz = getattr(mod, class_name)
        # Alias the the class so its constructor can be called, see the following link.
        # See https://www.programiz.com/python-programming/methods/built-in/eval
        alias = class_name + "Alias"
        instance = eval(alias + args, { alias: klazz})
        return instance
    except (ImportError, AttributeError) as e:
        raise ImportError(class_str)

if __name__ == "__main__":
    instance = create_instance("a.b.ClassB.ClassB('World')")
    instance.hello()

0voto

Nic Points 1

Meilleure réponse que j'ai trouvée : La meilleure façon est de créer un dictionnaire : objets ={} Noms =[objet1,objet2, objet3]

F objets[nom_objet]=nom_de_classe()

Trouvé dans : https://www.thecodingforums.com/threads/create-object-name-from-string-value.712461/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X