La reflexión en Python es mucho más fácil y flexible que en Java.
Recomiendo leer este tutorial
No hay una función directa (que yo sepa) que toma un nombre de clase totalmente calificado y devuelve la clase, sin embargo, tiene todas las piezas necesarias para construir eso y puede conectarlas.
Sin embargo, un pequeño consejo: no intente programar en estilo Java cuando esté en Python.
Si puede explicar qué es lo que está tratando de hacer, tal vez podamos ayudarlo a encontrar una forma más pitónica de hacerlo.
Aquí hay una función que hace lo que quieres:
def get_class( kls ):
parts = kls.split('.')
module = ".".join(parts[:-1])
m = __import__( module )
for comp in parts[1:]:
m = getattr(m, comp)
return m
Puede utilizar el valor de retorno de esta función como si fuera la propia clase.
Aquí tienes un ejemplo de uso:
>>> D = get_class("datetime.datetime")
>>> D
<type 'datetime.datetime'>
>>> D.now()
datetime.datetime(2009, 1, 17, 2, 15, 58, 883000)
>>> a = D( 2010, 4, 22 )
>>> a
datetime.datetime(2010, 4, 22, 0, 0)
>>>
¿Cómo funciona?
Estamos usando __import__
para importar el módulo que contiene la clase, lo que requería que primero extrajáramos el nombre del módulo del nombre completo. Luego importamos el módulo:
m = __import__( module )
En este caso, m
solo hará referencia al módulo de nivel superior,
Por ejemplo, si su clase vive en el foo.baz
módulo, entonces m
será el módulo. foo
Podemos obtener fácilmente una referencia para foo.baz
usargetattr( m, 'baz' )
Para pasar del módulo de nivel superior a la clase, debe usar de forma recursiva gettatr
en las partes del nombre de la clase
Digamos, por ejemplo, si el nombre de su clase es, foo.baz.bar.Model
entonces hacemos esto:
m = __import__( "foo.baz.bar" ) #m is package foo
m = getattr( m, "baz" ) #m is package baz
m = getattr( m, "bar" ) #m is module bar
m = getattr( m, "Model" ) #m is class Model
Esto es lo que está sucediendo en este bucle:
for comp in parts[1:]:
m = getattr(m, comp)
Al final del ciclo, m
habrá una referencia a la clase. Esto significa que en m
realidad es la clase en sí misma, puede hacer, por ejemplo:
a = m() #instantiate a new instance of the class
b = m( arg1, arg2 ) # pass arguments to the constructor
importlib.import
, que se exportó de python 3 a 2.7 ( docs.python.org/2/library/importlib.html )