Python использует другой родительский класс для дочернего класса

Используя python и django, мы создаем фреймворк для запуска ряда научных моделей. Python запускает модели, а django используется для отслеживания статуса и создания вывода на веб-страницы. В рабочем режиме это работает нормально, так как доступна вся платформа (база данных, исполняемый файл django). Однако для автономного создания и тестирования новых моделей мои коллеги часто работают над автономным кодом, без связи с окружающей средой. Тогда часть django часто является бременем (среда, база данных должна быть настроена, вычислительные затраты). Поэтому мы ищем способ включать и выключать Django-функции.

В настоящее время у нас есть общий класс iModel, который имеет все функциональные возможности для запуска любой модели в рамках, а также некоторые вызовы django. Дочерние классы наследуются от этого класса и содержат функциональные возможности модели.

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "framework.settings")
import django.some.modules

class iModel(iModel):
    def run(self):
        some django calls (eg. change status in DB to 'running')
        self.prepareInputdata()
        self.runModel()
        some more calls (eg. change status in DB to 'finished')

    def prepareInputData(self):
        example of some code that is used by all child models

class CATmodel(iModel):
    def runModel(self):
        some specific code for CAT-model

class DOGmodel(iModel):
    def runModel(self):
        some specific code for DOG-model

Я думал о разделении класса iModel на два класса. дополнительный класс iClassWithDjango(), который наследуется от iModel и добавляет функциональность Django. Как обертка вокруг класса iModel.

первый класс

class iModel(Object):
    def run(self):
        self.prepareInputDate()
        self.runModel()

и второй класс

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "framework.settings")
import django.some.modules

class iModelWithDjango(iModel):
    def run(self):
        some django calls (eg. change status in DB to 'running')
        super(iModelWithDjango,run)
        some more calls (eg. change status in DB to 'finished')

В зависимости от ситуации (работающей или автономной) DOGmodel и CATmodel наследуют соотв. из iModelwithDjango() или iModel(). Поэтому динамически изменяйте родительский класс во время выполнения.

На самом деле моя самая большая проблема заключается в том, как обработать импорт модулей django. Как я могу предотвратить это в автономном режиме (так как это не удастся, потому что среда django не настроена). Моя идея заключалась в том, чтобы поместить iModelWithDjango() в отдельный файл модуля (как сделано выше), но, возможно, есть более эффективные способы сделать это.

Может быть, с большим количеством грязного кодирования я мог бы справиться с этим, но я надеялся, что некоторые из вас могут подтолкнуть меня к некоторой чистой практике кодирования. Любой совет приветствуется

1 ответ

Если я хорошо понимаю ваш вопрос, вы хотели бы условно связать (импортировать) модули с вашим проектом. Есть разные способы сделать это.

одним из способов будет:

if standAlone:
  from iModel import IModel
  runner = IModel
else:
  from iModelWithDjango import IModelWithDjango
  runner = IModelWithDjango

runner().run()
Другие вопросы по тегам