Die Reflexion in Python ist viel einfacher und flexibler als in Java.
Ich empfehle dieses Tutorial zu lesen
Es gibt keine direkte Funktion (die ich kenne), die einen vollständig qualifizierten Klassennamen annimmt und die Klasse zurückgibt. Sie haben jedoch alle Teile, die zum Erstellen erforderlich sind, und können sie miteinander verbinden.
Ein Tipp: Versuchen Sie nicht, im Python-Stil zu programmieren, wenn Sie in Python sind.
Wenn Sie erklären können, was Sie versuchen, können wir Ihnen vielleicht helfen, einen pythonischeren Weg zu finden.
Hier ist eine Funktion, die macht, was Sie wollen:
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
Sie können den Rückgabewert dieser Funktion so verwenden, als wäre es die Klasse selbst.
Hier ist ein Anwendungsbeispiel:
>>> 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)
>>>
Wie funktioniert das?
Wir verwenden __import__
das Modul, das die Klasse enthält. Daher müssen wir zuerst den Modulnamen aus dem vollständig qualifizierten Namen extrahieren. Dann importieren wir das Modul:
m = __import__( module )
In diesem Fall m
bezieht sich nur auf das Modul der obersten Ebene,
Wenn Ihre Klasse beispielsweise im foo.baz
Modul lebt , ist m
dies das Modul. foo
Wir können leicht einen Verweis auf die foo.baz
Verwendung erhaltengetattr( m, 'baz' )
Um vom Modul der obersten Ebene zur Klasse zu gelangen, müssen gettatr
die Teile des Klassennamens rekursiv verwendet werden
Sagen foo.baz.bar.Model
wir zum Beispiel, wenn Ihr Klassenname lautet, machen wir Folgendes:
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
Folgendes passiert in dieser Schleife:
for comp in parts[1:]:
m = getattr(m, comp)
Am Ende der Schleife m
wird ein Verweis auf die Klasse angezeigt. Dies bedeutet, dass m
es sich tatsächlich um die Klasse selbst handelt, die Sie beispielsweise ausführen können:
a = m() #instantiate a new instance of the class
b = m( arg1, arg2 ) # pass arguments to the constructor
importlib.import
, die von Python 3 auf 2.7 ( docs.python.org/2/library/importlib.html ) zurückportiert wurde