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()