Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 30, 2018 08:29:25

_alexs_
Зарегистрирован: 2012-04-02
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

Динамический импорт классов

Есть два базовых класса, FirstParentClass и SecontParentClass, также есть некоторое количество классов-потомков от каждого из них. Каждый класс-потомок описан в своем *.py файле, пути к файлам известны. Нужно программно импортировать и создавать объекты классов. Сейчас делаю так:

 import inspect
import importlib
class_name = "FirstChildClass"
file_path = "/path/to/class.py"
try:
    spec = importlib.util.spec_from_file_location(class_name, file_path)
    module = importlib.util.module_from_spec(spec)
    spec.loader.exec_module(module)
    for x in dir(module):
        obj = getattr(module, x)
        if inspect.isclass(obj) and (issubclass(obj, FirstParentClass) or issubclass(obj, SecondParentClass)) and obj.__name__ == class_name:
            return obj()
except ImportError as e:
    print(e)

Такой способ работает, но нужно знать имя загружаемого класса. А можно ли как-то обойтись без имени класса, ведь класс в файле всего один?

Офлайн

#2 Янв. 30, 2018 09:06:39

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Динамический импорт классов

_alexs_
А можно ли как-то обойтись без имени класса, ведь класс в файле всего один?
Есть несколько способов:
1) после импорта нужных модулей получить классы как наследников некоего базового класса MyBaseClass.__subclassess__
2) Сделать метакласс, который будет регистрировать нужные классы в какой-то структуре
3) То же самое сделать декоратором
4) регистрировать классы вручную



Офлайн

#3 Янв. 30, 2018 10:03:22

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2832
Репутация: +  186  -
Профиль   Отправить e-mail  

Динамический импорт классов

В модуле нужно создать переменную __all__ с кортежем того что можно импортировать. А затем просто читаешь что в ней записано и получаешь имена классов.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version