En python, tengo que crear una instancia de cierta clase, sabiendo su nombre en una cadena, pero esta clase 'vive' en un módulo importado dinámicamente. A continuación se muestra un ejemplo:
script de clase de cargador:
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
script de algún módulo cargado dinámicamente:
class myName:
# etc...
Utilizo esta disposición para hacer que cualquier módulo cargado dinámicamente sea utilizado por la clase loader siguiendo ciertos comportamientos predefinidos en los módulos cargados dinámicamente ...
module = __import__(module, fromlist=[name])
Solo funcionó para mí.obj.__module__
importlib.import_module
cargará el archivo .py en una pyc si es necesario, así como manejará el módulo completo.nombre.pathing.to.get.to.la clase.__import__
no hará ninguna de estas cosas, en un entorno django (no probado fuera de esto)tl; dr
Importe el módulo raíz
importlib.import_module
y cargue la clase por su nombre usando lagetattr
función:explicaciones
Probablemente no desee utilizar
__import__
para importar dinámicamente un módulo por nombre, ya que no le permite importar submódulos:Esto es lo que dice el documento de Python
__import__
:En su lugar, use el
importlib
módulo estándar para importar dinámicamente un módulo por nombre. Congetattr
usted puede crear una instancia de una clase por su nombre:También podrías escribir:
Este código es válido en python ≥ 2.7 (incluido python 3).
fuente
mod = __import__("os.path"); mod.join
mientras que el siguiente no:mod = importlib.import_module("os.path"); mod.join
Use
getattr
para obtener un atributo de un nombre en una cadena. En otras palabras, obtenga la instancia comofuente
Fragmento de copiar y pegar:
fuente
Si desea que esta oración
from foo.bar import foo2
se cargue dinámicamente, debe hacer estofuente
Uno simplemente puede usar la
pydoc.locate
función.fuente
No pude llegar allí en mi caso de uso de los ejemplos anteriores, pero Ahmad me consiguió el más cercano (gracias). Para aquellos que lean esto en el futuro, aquí está el código que funcionó para mí.
fuente