В python мне нужно создать экземпляр определенного класса, зная его имя в строке, но этот класс «живет» в динамически импортированном модуле. Вот пример:
скрипт класса загрузчика:
import sys
class loader:
def __init__(self, module_name, class_name): # both args are strings
try:
__import__(module_name)
modul = sys.modules[module_name]
instance = modul.class_name() # obviously this doesn't works, here is my main problem!
except ImportError:
# manage import error
скрипт некоторых динамически загружаемых модулей:
class myName:
# etc...
Я использую это расположение, чтобы любой динамически загружаемый модуль использовался классом загрузчика, следуя определенным предопределенным поведениям в dyn -loaded-modules ...
module = __import__(module, fromlist=[name])
работал только для меня.obj.__module__
importlib.import_module
при необходимости загрузит файл .py в pyc, а также обработает полный класс module.name.pathing.to.get.to.the.__import__
не будет делать ни одну из этих вещей в среде django (не проверенной вне этого)ТЛ; др
Импортируйте корневой модуль с помощью
importlib.import_module
и загрузите класс по его имени, используяgetattr
функцию:объяснения
Вы, вероятно, не хотите использовать
__import__
для динамического импорта модуля по имени, так как он не позволяет импортировать подмодули:Вот что говорит о Python Doc
__import__
:Вместо этого используйте стандартный
importlib
модуль для динамического импорта модуля по имени. Сgetattr
вы можете затем создать экземпляр класса по имени:Вы также можете написать:
Этот код действителен в Python ≥ 2.7 (включая Python 3).
источник
mod = __import__("os.path"); mod.join
то время как следующий не делает:mod = importlib.import_module("os.path"); mod.join
Используйте
getattr
для получения атрибута из имени в строке. Другими словами, получить экземпляр какисточник
Скопировать-вставить фрагмент:
источник
Если вы хотите, чтобы это предложение
from foo.bar import foo2
загружалось динамически, вы должны сделать этоисточник
Можно просто использовать
pydoc.locate
функцию.источник
Я не вполне смог добраться до моего варианта использования из приведенных выше примеров, но Ахмад подобрал меня ближе всех (спасибо). Для тех, кто читает это в будущем, вот код, который работал для меня.
источник