La riflessione in Python è molto più semplice e molto più flessibile di quanto non sia in Java.
Consiglio di leggere questo tutorial
Non esiste una funzione diretta (che io sappia) che prenda un nome di classe completo e restituisca la classe, tuttavia hai tutti i pezzi necessari per costruirla e puoi collegarli insieme.
Un consiglio però: non provare a programmare in stile Java quando sei in Python.
Se puoi spiegare cosa stai cercando di fare, forse possiamo aiutarti a trovare un modo più pitonico per farlo.
Ecco una funzione che fa quello che vuoi:
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
È possibile utilizzare il valore di ritorno di questa funzione come se fosse la classe stessa.
Ecco un esempio di utilizzo:
>>> 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)
>>>
Come funziona?
Stiamo utilizzando __import__per importare il modulo che contiene la classe, che richiedeva di estrarre prima il nome del modulo dal nome completo. Quindi importiamo il modulo:
m = __import__( module )
In questo caso, si mfarà riferimento solo al modulo di primo livello,
Ad esempio, se la tua classe vive in foo.bazmodule, allora msarà il modulo foo
che possiamo facilmente ottenere un riferimento foo.bazall'usogetattr( m, 'baz' )
Per passare dal modulo di primo livello alla classe, è necessario utilizzare ricorsivamente gettatrle parti del nome della classe
Ad esempio, se il nome della tua classe è, foo.baz.bar.Modelallora facciamo questo:
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
Questo è ciò che sta accadendo in questo ciclo:
for comp in parts[1:]:
m = getattr(m, comp)
Alla fine del ciclo, msarà un riferimento alla classe. Ciò significa che in mrealtà è la classe a sé stante, puoi fare ad esempio:
a = m() #instantiate a new instance of the class
b = m( arg1, arg2 ) # pass arguments to the constructor
importlib.import, di cui è stato eseguito il backport da python 3 a 2.7 ( docs.python.org/2/library/importlib.html )