Dada una cadena de una clase de Python, por ejemplo my_package.my_module.MyClass , ¿cuál es la mejor manera posible de cargarla?
En otras palabras, estoy buscando un equivalente Class.forName() en Java, función en Python. Tiene que funcionar en Google App Engine.
Preferiblemente, esta sería una función que acepta el FQN de la clase como una cadena y devuelve una referencia a la clase:
my_class = load_class('my_package.my_module.MyClass')
my_instance = my_class()
python
reflection
python-import
pjesi
fuente
fuente

Respuestas:
De la documentación de Python, aquí está la función que desea:
La razón por la que un simple
__import__no funcionará es porque cualquier importación de algo más allá del primer punto en una cadena de paquete es un atributo del módulo que está importando. Por lo tanto, algo como esto no funcionará:Tendría que llamar a la función anterior de esta manera:
O en el caso de tu ejemplo:
EDITAR : Estaba un poco fuera de lugar. Lo que básicamente quieres hacer es esto:
La función anterior solo es necesaria si tiene una lista vacía . Por lo tanto, la llamada apropiada sería así:
fuente
Si no quiere rodar el suyo, hay una función disponible en el
pydocmódulo que hace exactamente esto:La ventaja de este enfoque sobre los otros enumerados aquí es que
locateencontrará cualquier objeto de Python en la ruta de puntos proporcionada, no solo un objeto directamente dentro de un módulo. por ejmy_package.my_module.MyClass.attr.Si tienes curiosidad por cuál es su receta, aquí está la función:
Se basa en la
pydoc.safeimportfunción. Aquí están los documentos para eso:fuente
qualname(el objeto no está en la parte superior del espacio de nombres del módulo) correctamente también.locate('my_package.my_module.MyClass.attr.method.etc')fuente
fuente
(modulename, classname) = cl.rsplit('.', 2)rsplit('.', 1)?Si está usando Django, puede usar esto. Sí, sé que OP no solicitó django, pero me encontré con esta pregunta buscando una solución de Django, no encontré una y la puse aquí para el próximo chico / chica que la busca.
Tenga en cuenta que si desea importar algo que no tiene un me
.gustareoargparseuso:fuente
Aquí es para compartir algo que encontré
__import__yimportlibal intentar resolver este problema.Estoy usando Python 3.7.3.
Cuando trato de llegar a la clase
den el móduloa.b.c,La
modvariable se refiere al espacio de nombres superiora.Entonces, para llegar a la clase
d, necesitoSi tratamos de hacer
en realidad estamos tratando de buscar
a.d.Al usar
importlib, supongo que la biblioteca ha hecho el recursivogetattrpor nosotros. Entonces, cuando usamosimportlib.import_module, en realidad obtenemos el módulo más profundo.fuente
OK, para mí esa es la forma en que funcionó (estoy usando Python 2.7):
Entonces, b es una instancia de la clase 'MyClass'
fuente
Si ya tiene una instancia de su clase deseada, puede usar la función 'tipo' para extraer su tipo de clase y usarla para construir una nueva instancia:
fuente
fuente
En Google App Engine hay una
webapp2función llamadaimport_string. Para obtener más información, consulte aquí: https://webapp-improved.appspot.com/api/webapp2.htmlEntonces,
Por ejemplo, esto se usa en el lugar
webapp2.Routedonde puede usar un controlador o una cadena.fuente