python为子类使用不同的父类

时间:2014-04-25 21:03:07

标签: python django oop inheritance dynamic-class-creation

使用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将继承resp。来自iModelwithDjango()或iModel()。因此,在运行时动态更改父类。

实际上我最大的问题是如何处理django模块的导入。如何防止在离线模式下发生这种情况(因为未设置django环境会失败)。我的想法是将iModelWithDjango()放在一个单独的模块文件中(如上所述),但也许有更好的方法可以做到这一点。

也许有很多杂乱的编码,我可以把它拉下来,但我希望你们中的一些人可以引导我进行一些干净的编码练习。欢迎任何建议

1 个答案:

答案 0 :(得分:0)

如果我理解您的问题,您希望有条件地将(导入)模块链接到您的项目。有多种方法可以做到。

一种方式是:

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

runner().run()