La réflexion en python est beaucoup plus facile et beaucoup plus souples que c'est en Java.
Je vous recommande la lecture de ce tutoriel
Il n'y a pas de fonction directe (que je connais) qui prend un nom de classe entièrement qualifié et retourne la classe, cependant, vous avez toutes les pièces nécessaires à la construction, et vous pouvez les connecter entre eux.
Un petit conseil cependant: n'essayez pas de programmer en Java de style lorsque vous êtes en python.
Si vous pouvez expliquer qu'est-ce que vous êtes en train de faire, peut-être nous pouvons vous aider à trouver un plus pythonic façon de faire.
Voici une fonction qui fait ce que vous voulez:
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
Vous pouvez utiliser la valeur de retour de cette fonction, comme si c'était la classe elle-même.
Voici un exemple d'utilisation:
>>> 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)
>>>
Comment cela fonctionne?
Nous utilisons __import__
importer le module qui contient la classe, qui a exigé que nous avons d'abord extraire le nom du module à partir du nom complet. Ensuite, nous importons le module:
m = __import__( module )
Dans ce cas, m
ne fait référence qu'à haut niveau module,
Par exemple, si votre classe vit en foo.baz
module, alors m
sera le module foo
Nous pouvons facilement obtenir une référence à l' foo.baz
l'aide getattr( m, 'baz' )
Pour obtenir à partir du niveau supérieur du module de la classe, avoir à utiliser de manière récursive gettatr
sur les pièces, le nom de la classe
Disons, par exemple, si vous avez un nom de classe est - foo.baz.bar.Model
alors nous n'avons ceci:
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
C'est ce qui se passe dans cette boucle:
for comp in parts[1:]:
m = getattr(m, comp)
À la fin de la boucle, m
sera une référence à la classe. Cela signifie qu' m
est en fait la classe itslef, vous pouvez le faire par exemple:
a = m() #instantiate a new instance of the class
b = m( arg1, arg2 ) # pass arguments to the constructor