Comment charger dynamiquement une classe Python
Donné une chaîne d'un Python de classe, par exemple my_package.my_module.MyClass
, quelle est la meilleure façon de le charger?
En d'autres mots, je suis à la recherche d'un équivalent Class.forName()
en Java, une fonction en Python. Il a besoin de travailler sur Google App Engine.
De préférence, ce serait une fonction qui accepte la FQN de la classe comme une chaîne de caractères et retourne une référence à la classe:
my_class = load_class('my_package.my_module.MyClass')
my_instance = my_class()
- J'ai besoin d'être en mesure d'assigner la classe de référence à une variable.
- Ce qui semble être un doublon de: stackoverflow.com/questions/452969/...
- Vous avez raison c'est un doublon, merci pour le trouver
- J'ai jamais eu besoin de charger une classe comme ça en Python. Vous savez où le module est alors pourquoi ne pas charger le module et ensuite utiliser ses classes comme le Python veut que vous, son beaucoup plus simple
- Si vous n'avez jamais besoin de faire cela, alors vous n'avez pas écrit assez intéressant programmes encore. Continuer à pratiquer.
Vous devez vous connecter pour publier un commentaire.
De la documentation python, voici la fonction que vous voulez:
La raison pour laquelle un simple
__import__
de ne pas travailler est parce que toute importation de rien passé le premier point dans un paquet de chaîne est un attribut du module que vous importez. Donc, quelque chose comme cela ne fonctionne pas:Vous devez appeler la fonction ci-dessus comme suit:
Ou, dans le cas de votre exemple:
MODIFIER: j'ai été un peu hors sujet sur ce. Ce que vous avez l'impression de vouloir faire est ceci:
La fonction ci-dessus est uniquement nécessaire si vous avez un vide fromlist. Ainsi, l'appel approprié serait comme ceci:
my_import()
code n'est pas nécessaire, vous pouvez utiliser des points dans un__import__()
appel de l'amende juste. Ils ont tous pour désigner les noms de module cependant. Un symbole à partir du module doit être récupérées avecgetattr()
.fromlist
option (en python 2) c'est à diremod = __import__('my_package.my_module');
klass = getattr(mod, 'my_class')
est très bien. Je ne peux pas pour la vie de moi l'effet defromlist
, la documentation n'est pas clair pour moi.Si vous ne voulez pas passer votre propre, il n'y est une fonction disponible dans le
pydoc
module qui fait exactement cela:L'avantage de cette approche sur les autres, énumérés ici est que
locate
trouverez tout objet python au pointillé chemin, non pas un objet directement dans un module. par exemple,my_package.my_module.MyClass.attr
.Si vous êtes curieux de savoir ce que leur recette est, voici la fonction:
Il s'appuie sur
pydoc.safeimport
fonction. Voici les docs pour que:qualname
(objet n'est pas au top de module de l'espace de noms) correctement ainsi.locate('my_package.my_module.MyClass.attr.method.etc')
import_module
les importations d'un module de classe.(modulename, classname) = cl.rsplit('.', 2)
Si vous êtes à l'aide de Django, vous pouvez utiliser cette. Oui je suis au courant de l'OP n'a pas demander de django, mais j'ai couru à travers cette question de la recherche d'un Django solution, n'est-ce pas en trouver un, et de le mettre ici pour le prochain garçon/gal qui le cherche.
Gardez à l'esprit, si vous voulez importer quelque chose qui n'est pas un
.
, commere
ouargparse
utilisation:OK, c'est pour moi la façon dont il a travaillé (j'utilise Python 2.7):
Alors, b est une instance de la classe "Maclasse'
Si vous avez déjà une instance de votre classe, vous pouvez utiliser le "type" de la fonction pour en extraire le type de classe et l'utiliser pour construire une nouvelle instance:
Ici est de partager quelque chose que j'ai trouvé sur
__import__
etimportlib
tout en essayant de résoudre ce problème.Je suis à l'aide de Python 3.7.3.
Quand j'ai essayer d'obtenir à la classe
d
dans le modulea.b.c
,La
mod
variable consultez le top de l'espace de nomsa
.Donc, pour arriver à la classe
d
, j'ai besoin deSi nous essayons de faire
nous sommes en train d'essayer de regarder pour
a.d
.Lors de l'utilisation de
importlib
, je suppose que la bibliothèque a fait l'récursivegetattr
pour nous. Donc, lorsque nous utilisonsimportlib.import_module
, nous avons effectivement obtenir une poignée sur le plus profond de module.Dans Google App Engine il y a un
webapp2
fonction appeléeimport_string
. Pour plus d'infos, voir ici:https://webapp-improved.appspot.com/api/webapp2.htmlDonc,
Par exemple, il est utilisé dans le
webapp2.Route
où vous pouvez soit utiliser un gestionnaire ou une chaîne de caractères.