A reflexão em python é muito mais fácil e flexível do que em Java.
Eu recomendo a leitura deste tutorial
Não há nenhuma função direta (que eu saiba) que recebe um nome de classe totalmente qualificado e retorna a classe, no entanto, você tem todas as peças necessárias para construir isso e pode conectá-las.
Porém, um conselho: não tente programar no estilo Java quando estiver em python.
Se você puder explicar o que está tentando fazer, talvez possamos ajudá-lo a encontrar uma maneira mais pítônica de fazer isso.
Esta é uma função que faz o que você deseja:
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
Você pode usar o valor de retorno desta função como se fosse a própria classe.
Aqui está um exemplo 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)
>>>
Como isso funciona?
Estamos usando __import__
para importar o módulo que contém a classe, o que exigiu que primeiro extraíssemos o nome do módulo do nome totalmente qualificado. Em seguida, importamos o módulo:
m = __import__( module )
Nesse caso, m
se referirá apenas ao módulo de nível superior,
Por exemplo, se sua classe reside em um foo.baz
módulo, então m
será o módulo. foo
Podemos facilmente obter uma referência ao foo.baz
usogetattr( m, 'baz' )
Para ir do módulo de nível superior para a classe, deve-se usar recursivamente gettatr
nas partes do nome da classe
Digamos, por exemplo, se o nome da sua classe é, foo.baz.bar.Model
então fazemos o seguinte:
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
Isso é o que está acontecendo neste loop:
for comp in parts[1:]:
m = getattr(m, comp)
No final do loop, m
haverá uma referência para a aula. Isso significa que m
na verdade é a própria classe, você pode fazer, por exemplo:
a = m() #instantiate a new instance of the class
b = m( arg1, arg2 ) # pass arguments to the constructor
importlib.import
, que foi feito backport de python 3 para 2.7 ( docs.python.org/2/library/importlib.html )