Отражение в Python намного проще и гибче, чем в Java.
Я рекомендую прочитать этот урок
Нет прямой функции (о которой я знаю), которая принимает полное имя класса и возвращает класс, однако у вас есть все части, необходимые для его создания, и вы можете соединить их вместе.
Один небольшой совет: не пытайтесь программировать в стиле Java, когда вы работаете на Python.
Если вы сможете объяснить, что именно вы пытаетесь сделать, возможно, мы сможем помочь вам найти более питонический способ сделать это.
Вот функция, которая делает то, что вы хотите:
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
Вы можете использовать возвращаемое значение этой функции, как если бы это был сам класс.
Вот пример использования:
>>> 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)
>>>
Как это работает?
Мы используем __import__
для импорта модуля, содержащего класс, что требовало, чтобы мы сначала извлекли имя модуля из полного имени. Затем импортируем модуль:
m = __import__( module )
В этом случае m
будет относиться только к модулю верхнего уровня,
Например, если ваш класс живет в foo.baz
модуле, тогда m
это будет модуль. foo
Мы можем легко получить ссылку на foo.baz
использованиеgetattr( m, 'baz' )
Чтобы перейти от модуля верхнего уровня к классу, необходимо рекурсивно использовать gettatr
части имени класса
Скажем, например, если ваше имя класса, foo.baz.bar.Model
мы сделаем следующее:
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
Вот что происходит в этом цикле:
for comp in parts[1:]:
m = getattr(m, comp)
В конце цикла m
будет ссылка на класс. Это означает, что m
на самом деле это класс itslef, вы можете, например,:
a = m() #instantiate a new instance of the class
b = m( arg1, arg2 ) # pass arguments to the constructor
importlib.import
, который был перенесен с python 3 на 2.7 ( docs.python.org/2/library/importlib.html )