Учитывая строку класса Python, например my_package.my_module.MyClass
, каков наилучший способ ее загрузки?
Другими словами, я ищу эквивалент Class.forName()
в Java, функцию в Python. Это должно работать на Google App Engine.
Предпочтительно это будет функция, которая принимает FQN класса в виде строки и возвращает ссылку на класс:
my_class = load_class('my_package.my_module.MyClass')
my_instance = my_class()
Ответы:
Из документации по питону, вот функция, которую вы хотите:
Причина, по которой простое
__import__
не сработает, заключается в том, что любой импорт чего-либо после первой точки в строке пакета является атрибутом импортируемого вами модуля. Таким образом, что-то вроде этого не будет работать:Вы должны вызвать вышеуказанную функцию следующим образом:
Или в случае вашего примера:
РЕДАКТИРОВАТЬ : Я был немного от этого. То, что вы в основном хотите сделать, это:
Вышеуказанная функция необходима, только если у вас есть пустой список. Таким образом, соответствующий вызов будет выглядеть так:
источник
Если вы не хотите бросать свои собственные, в
pydoc
модуле доступна функция, которая делает именно это:Преимущество этого подхода перед другими, перечисленными здесь, состоит в том, что
locate
он найдет любой объект python по указанному пунктирному пути, а не просто объект непосредственно в модуле. напримерmy_package.my_module.MyClass.attr
.Если вам интересно, каков их рецепт, вот функция:
Это зависит от
pydoc.safeimport
функции. Вот документы для этого:источник
qualname
(объект не в верхней части пространства имен модуля).locate('my_package.my_module.MyClass.attr.method.etc')
источник
источник
(modulename, classname) = cl.rsplit('.', 2)
rsplit('.', 1)
?Если вы используете Django, вы можете использовать это. Да, я знаю, что OP не спрашивал django, но я наткнулся на этот вопрос в поисках решения Django, не нашел его и поместил его здесь для следующего мальчика / gal, который его ищет.
Имейте в виду, если вы хотите импортировать то, что не имеет
.
, нравитсяre
илиargparse
использовать:источник
Вот, чтобы поделиться тем, что я нашел на
__import__
иimportlib
пока пытаюсь решить эту проблему.Я использую Python 3.7.3.
Когда я пытаюсь добраться до класса
d
в модулеa.b.c
,mod
Переменный относятся к верхнему пространству именa
.Итак, чтобы попасть в класс
d
, мне нужноЕсли мы попытаемся сделать
мы на самом деле пытаемся найти
a.d
.При использовании
importlib
, я полагаю, библиотека сделала рекурсивgetattr
для нас. Итак, когда мы используемimportlib.import_module
, мы фактически получаем указатель на самый глубокий модуль.источник
ОК, для меня это так (я использую Python 2.7):
Тогда b является экземпляром класса 'MyClass'
источник
Если у вас уже есть экземпляр нужного вам класса, вы можете использовать функцию 'type', чтобы извлечь его тип класса, и использовать его для создания нового экземпляра:
источник
источник
В Google App Engine есть
webapp2
функция под названиемimport_string
. Для получения дополнительной информации см. Здесь: https://webapp-improved.appspot.com/api/webapp2.html.Так,
Например, это используется там,
webapp2.Route
где вы можете использовать либо обработчик, либо строку.источник