La réflexion en python est beaucoup plus facile et beaucoup plus flexible qu'en Java.
Je recommande de lire ce tutoriel
Il n'y a pas de fonction directe (que je connaisse) qui prend un nom de classe pleinement qualifié et renvoie la classe, mais vous avez toutes les pièces nécessaires pour construire cela, et vous pouvez les connecter ensemble.
Un petit conseil cependant: n'essayez pas de programmer en style Java lorsque vous êtes en python.
Si vous pouvez expliquer ce que vous essayez de faire, nous pouvons peut-être vous aider à trouver une manière plus pythonique de le 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 s'il s'agissait de 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 ça marche?
Nous utilisons __import__
pour importer le module qui contient la classe, ce qui nécessitait d'extraire d'abord le nom du module du nom complet. Ensuite, nous importons le module:
m = __import__( module )
Dans ce cas, m
se référera uniquement au module de niveau supérieur,
Par exemple, si votre classe vit dans le foo.baz
module, alors m
sera le module foo
Nous pouvons facilement obtenir une référence à l' foo.baz
utilisationgetattr( m, 'baz' )
Pour passer du module de niveau supérieur à la classe, il faut utiliser récursivement gettatr
sur les parties du nom de la classe
Disons par exemple, si votre nom de classe est foo.baz.bar.Model
alors nous faisons 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'il m
s'agit en fait de la classe itslef, vous pouvez faire par exemple:
a = m() #instantiate a new instance of the class
b = m( arg1, arg2 ) # pass arguments to the constructor
importlib.import
, qui a été rétroporté de python 3 à 2.7 ( docs.python.org/2/library/importlib.html )