Python dynamique de l'instanciation de la chaîne de nom d'une classe et dynamique, le module importé
En python, je dois instancier certaine classe, sachant son nom dans une chaîne de caractères, mais cette classe "vies" dans dynamiquement, un module importé. Prenons l'exemple suivant:
chargeur-script de classe:
import sys
class loader:
def __init__(self, module_name, class_name): # both args are strings
try:
__import__(module_name)
modul = sys.modules[module_name]
instance = modul.class_name() # obviously this doesn't works, here is my main problem!
except ImportError:
# manage import error
quelques-chargées dynamiquement-module de script:
class myName:
# etc...
- Je utiliser cet arrangement pour effectuer toute chargées dynamiquement-module pour être utilisé par le chargeur de classe à la suite de certains comportements prédéfinis dans le dyn-chargé-modules...
Toutes les idées sont les bienvenues.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser getattr
pour accéder à la classe. Code plus complet:
Comme mentionné ci-dessous, nous pouvons utiliser importlib
module = __import__(module, fromlist=[name])
seulement travaillé pour moi.obj.__module__
importlib.import_module
charge la .py fichier dans un pyc si nécessaire ainsi que de gérer le module complet.nom.cheminement.d'.obtenir.d'.la classe.__import__
ne sera pas faire ces choses, dans un django environnement (pas testé en dehors de cela)tl;dr
Importer le module racine avec
importlib.import_module
et de la charge de la classe par son nom à l'aide degetattr
fonction:explications
Vous ne voulez probablement pas à utiliser
__import__
dynamique d'importer un module par son nom, car il ne vous permet pas d'importer des submodules:Ici est ce que le python doc a dit à propos de
__import__
:Au lieu de cela, utiliser la norme
importlib
module dynamique d'importer un module par son nom. Avecgetattr
vous pouvez ensuite instancier une classe par son nom:Vous pouvez également écrire:
Ce code est valide en python ≥ 2.7 (y compris python 3).
mod = __import__("os.path"); mod.join
tandis que le suivant ne marche pas:mod = importlib.import_module("os.path"); mod.join
Utilisation
getattr
pour obtenir un attribut à partir d'un nom dans une chaîne de caractères. En d'autres termes, obtenir de l'instance commeCopier-coller l'extrait de code:
Si vous voulez que cette phrase
from foo.bar import foo2
être chargés dynamiquement, vous devriez faire ceJe ne pouvais pas tout à fait là dans mon cas d'utilisation à partir des exemples ci-dessus, mais Ahmad m'a le plus proche (merci). Pour ceux qui nous lisent dans l'avenir, voici le code qui a fonctionné pour moi.
On peut simplement utiliser la
pydoc.locate
fonction.