Отражение в 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
на самом деле является классом его самого, вы можете сделать, например:
a = m() #instantiate a new instance of the class
b = m( arg1, arg2 ) # pass arguments to the constructor