Étant donné une chaîne d'une classe Python, par exemple my_package.my_module.MyClass
, quelle est la meilleure façon possible de la charger?
En d'autres termes, je recherche un équivalent Class.forName()
en Java, une fonction en Python. Il doit fonctionner sur Google App Engine.
De préférence, ce serait une fonction qui accepte le FQN de la classe sous forme de chaîne et renvoie une référence à la classe:
my_class = load_class('my_package.my_module.MyClass')
my_instance = my_class()
Réponses:
Dans la documentation python, voici la fonction que vous souhaitez:
La raison pour laquelle un simple
__import__
ne fonctionnera pas est que toute importation de tout ce qui se trouve après le premier point d'une chaîne de package est un attribut du module que vous importez. Ainsi, quelque chose comme ça ne fonctionnera pas:Vous devrez appeler la fonction ci-dessus comme ceci:
Ou dans le cas de votre exemple:
EDIT : J'étais un peu hors de ça. Ce que vous voulez faire, c'est ceci:
La fonction ci-dessus n'est nécessaire que si vous avez une liste vide . Ainsi, l'appel approprié serait comme ceci:
la source
Si vous ne voulez pas rouler vous-même, il existe une fonction disponible dans le
pydoc
module qui fait exactement cela:L'avantage de cette approche par rapport aux autres listées ici est qu'elle
locate
trouvera n'importe quel objet Python dans le chemin en pointillé fourni, pas seulement un objet directement dans un module. par exemplemy_package.my_module.MyClass.attr
.Si vous êtes curieux de savoir quelle est leur recette, voici la fonction:
Il repose sur la
pydoc.safeimport
fonction. Voici la documentation pour cela:la source
qualname
correctement (l'objet qui n'est pas en haut de l'espace de noms du module).locate('my_package.my_module.MyClass.attr.method.etc')
la source
la source
(modulename, classname) = cl.rsplit('.', 2)
rsplit('.', 1)
?Si vous utilisez Django, vous pouvez l'utiliser. Oui, je sais qu'OP n'a pas demandé django, mais j'ai rencontré cette question à la recherche d'une solution Django, je n'en ai pas trouvé et je l'ai mise ici pour le prochain garçon / fille qui la recherche.
Gardez à l'esprit que si vous souhaitez importer quelque chose qui n'a pas
.
, commere
ouargparse
n'utilise pas:la source
Voici pour partager quelque chose que j'ai trouvé sur
__import__
etimportlib
en essayant de résoudre ce problème.J'utilise Python 3.7.3.
Quand j'essaye d'accéder à la classe
d
dans le modulea.b.c
,La
mod
variable fait référence à l'espace de noms supérieura
.Alors pour aller en classe
d
, je doisSi nous essayons de faire
nous essayons en fait de rechercher
a.d
.Lors de l'utilisation
importlib
, je suppose que la bibliothèque a fait le récursifgetattr
pour nous. Ainsi, lorsque nous utilisonsimportlib.import_module
, nous obtenons en fait une poignée sur le module le plus profond.la source
OK, pour moi, c'est ainsi que cela fonctionnait (j'utilise Python 2.7):
Ensuite, b est une instance de la classe 'MyClass'
la source
Si vous avez déjà une instance de la classe souhaitée, vous pouvez utiliser la fonction 'type' pour extraire son type de classe et l'utiliser pour construire une nouvelle instance:
la source
la source
Dans Google App Engine, il existe une
webapp2
fonction appeléeimport_string
. Pour plus d'informations, voir ici: https://webapp-improved.appspot.com/api/webapp2.htmlAlors,
Par exemple, cela est utilisé dans le
webapp2.Route
où vous pouvez utiliser un gestionnaire ou une chaîne.la source