Python - Динамический импорт классов - PullRequest
5 голосов
/ 09 ноября 2011

У меня следующая структура папок:

- MyProject
    - App1
        - some_module1.py
        - some_module2.py
    - App2
        - some_other_module1.py
        - some_other_module2.py

Внутри каждого из модулей (например, some_module1.py) есть класс, который расширяется от базового класса, в моем случае, Producer.

То, что я пытаюсь сделать, - это динамическая загрузка в этом классе. Для этого у меня есть список «установленных приложений», который выглядит следующим образом:

INSTALLED_APPS = (
    'App1',
    'App2',
)

Я пытаюсь написать функцию, которая будет проверять каждый пакет "app" на предмет определенного класса производителя и проверять его расширение от базового класса производителя. Примерно так:

module_class = 'some_module1.SomeClass'

# Loop through each package in the INSTALLED_APPS tuple:
for app in INSTALL_APPS:
    try:
        #is the module_class found in this app?
        #App1.some_module1.SomeClass - Yes
        #App2.some_module1.SomeClass - No

        # is the class we found a subclass of Producer?
    exception ImportError:
        pass

Я пытался поэкспериментировать с imp и importlib, но, похоже, он не справляется с этим видом импорта. Можно ли мне как-нибудь этого добиться?

1 Ответ

5 голосов
/ 09 ноября 2011

Возможно, вы захотите взглянуть на:

  • __import__() для импорта модулей, зная их имя как строку;
  • dir() для получения имен всех объектов модуля (атрибутов, функций и т. Д.);
  • inspect.isclass(getattr(<module ref>, <object name>)) для идентификации классов среди объектов модуля;
  • issubclass() для определения подклассов из данного класса, , как объяснено здесь .

С помощью этих инструментов вы можете идентифицировать все классы в данном модуле, которые наследуют данный класс.

Я использую этот механизм для динамического создания классов из данного модуля, чтобы их обновления автоматически учитывались на верхнем уровне.

...