Créer une instance de classe inconnue en Python

De Codedev Wiki
Sauter à la navigation Sauter à la recherche

Préambule

Ce tutoriel vous permettra d'apprendre comment on peut instancier une classe en Python, sans connaître son nom à l'avance dans le code. Ce principe, très utilisé en PHP, permet de charger dynamiquement une classe, par exemple qui peut être reconnue automatiquement sans devoir modifier le code principal (une sorte d'extension au programme).

Instanciation

L'instanciation d'une classe depuis son nom n'est pas compliqué :

obj = globals()['laclasse']

Ici, dnas une variable obj, nous demandons à la fonction globals d'aller chercher et d'instancier la classe indiqué entre crochets. Bien entendu ici on la nomme donc pas très utile, mais cela pourrait être récupérer depuis une variable qui serait renseignée dynamiquement.

Utilisation

Pour pouvoir utiliser notre instance, nous devons terminer explicitement l'instanciation :

result = obj()

Ici, nous avons récupérer l'instance effective dans la variable result. Nous pouvons maintenant tranquillement faire appel aux méthodes ou propriétés de la classe.

Astuce

La petite astuce consiste à mettre les parenthèses après les crochet s:

obj = globals()['laclasse']()

Ainsi, obj contient directement l'instance de notre classe que nous pouvons ensuite utiliser tranquillement.

Conclusion

L'instanciation d'une classe d'après un nom, est un fonctionnement assez pratique pour créer des systèmes de plugins dans nos programmes. En PHP par exemple, c'est très utilisé pour faire des register des classes créer par le développeur, ce qui permet à des outils de s'en servir. Un exemple courant, ce sont les extensions de Twig qui nécessitent d'être enregistrée, cela permet alors qu'il instancie la classe de cette façon et puisse donc la reconnaître et travailler avec.

Dans les autres langages, il n'est pas courant de s'en servir, car en web c'est super utile et moins utilisé en fenêtrage par exemple. Le Python, nous apporte toutefois ce fonctionnement qui est assez pratique.