【问题标题】:python use different parent class for child classpython对子类使用不同的父类
【发布时间】:2014-04-25 21:03:06
【问题描述】:

我们正在使用 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() 放在一个单独的模块文件中(如上所述),但也许有更好的方法来做到这一点。

也许我可以通过大量杂乱的编码来解决这个问题,但我希望你们中的一些人可以引导我进行一些干净的编码练习。欢迎任何建议

【问题讨论】:

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


    【解决方案1】:

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

    一种方法是:

    if standAlone:
      from iModel import IModel
      runner = IModel
    else:
      from iModelWithDjango import IModelWithDjango
      runner = IModelWithDjango
    
    runner().run()
    

    【讨论】:

    • 我认为这不足以解决问题。模型以 CATmodel.run() 启动。那时正确的父母应该已经在使用,不是吗?或者也许有办法解决这个问题?
    • “父母”是什么意思?它将起作用,因为如果standAlone 为True,则永远不会导入Django 的东西,并且就Python 而言,它甚至不需要存在于您的计算机上。实际上,通过这种方式,您可以实例化并运行两个完全不相关的类,前提是它们的鸭子类型相同(即,在此示例中,它们提供了一个 run() 方法)。不过,就个人而言,我会鼓励一个共同的超类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-27
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多