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 m
farà riferimento solo al modulo di primo livello,
Ad esempio, se la tua classe vive in foo.baz
module, allora m
sarà il modulo foo
che possiamo facilmente ottenere un riferimento foo.baz
all'usogetattr( m, 'baz' )
Per passare dal modulo di primo livello alla classe, è necessario utilizzare ricorsivamente gettatr
le parti del nome della classe
Ad esempio, se il nome della tua classe è, foo.baz.bar.Model
allora 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, m
sarà un riferimento alla classe. Ciò significa che in m
realtà è 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 )