Odbicie w Pythonie jest dużo łatwiejsze i znacznie bardziej elastyczne niż w Javie.
Polecam przeczytanie tego poradnika
Nie ma bezpośredniej funkcji (o której wiem), która pobiera w pełni kwalifikowaną nazwę klasy i zwraca klasę, jednak masz wszystkie elementy potrzebne do jej zbudowania i możesz je połączyć.
Jedna rada: nie próbuj programować w stylu Java, gdy jesteś w Pythonie.
Jeśli potrafisz wyjaśnić, co próbujesz zrobić, może pomożemy Ci znaleźć bardziej pytoniczny sposób zrobienia tego.
Oto funkcja, która robi to, co chcesz:
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
Możesz użyć wartości zwracanej przez tę funkcję, tak jakby była ona samą klasą.
Oto przykład użycia:
>>> 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)
>>>
Jak to działa?
Używamy __import__
do importowania modułu, który zawiera klasę, co wymagało, abyśmy najpierw wyodrębnili nazwę modułu z w pełni kwalifikowanej nazwy. Następnie importujemy moduł:
m = __import__( module )
W tym przypadku m
będzie odnosić się tylko do modułu najwyższego poziomu,
Na przykład, jeśli twoja klasa mieszka w foo.baz
module, m
będzie to moduł. foo
Możemy łatwo uzyskać odniesienie do foo.baz
usinggetattr( m, 'baz' )
Aby dostać się z modułu najwyższego poziomu do klasy, należy rekurencyjnie użyć gettatr
na częściach nazwy klasy
Powiedz na przykład, że jeśli nazwa klasy to foo.baz.bar.Model
, robimy to:
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
Oto, co dzieje się w tej pętli:
for comp in parts[1:]:
m = getattr(m, comp)
Na końcu pętli m
będzie odniesienie do klasy. Oznacza to, że m
jest to właściwie klasa sama w sobie, możesz na przykład:
a = m() #instantiate a new instance of the class
b = m( arg1, arg2 ) # pass arguments to the constructor
importlib.import
aby zapoznać się z przykładem użycia , które zostało przeniesione z pythona 3 do 2.7 ( docs.python.org/2/library/importlib.html )