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
pydoc
módulo que hace exactamente esto:La ventaja de este enfoque sobre los otros enumerados aquí es que
locate
encontrará 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.safeimport
funció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
.
gustare
oargparse
uso:fuente
Aquí es para compartir algo que encontré
__import__
yimportlib
al intentar resolver este problema.Estoy usando Python 3.7.3.
Cuando trato de llegar a la clase
d
en el móduloa.b.c
,La
mod
variable 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 recursivogetattr
por 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
webapp2
funció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.Route
donde puede usar un controlador o una cadena.fuente