Відображення в 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 )