Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python对子类使用不同的父类_Python_Django_Oop_Inheritance_Dynamic Class Creation - Fatal编程技术网

python对子类使用不同的父类

python对子类使用不同的父类,python,django,oop,inheritance,dynamic-class-creation,Python,Django,Oop,Inheritance,Dynamic Class Creation,使用python和django,我们正在创建一个框架来运行许多科学模型。Python运行模型,django用于跟踪状态并创建网页输出。在操作模式下,这很好,因为整个平台(数据库、django可执行文件)都可用。然而,对于新模型的离线创建和测试,我的同事们通常使用独立的代码,与环境没有任何联系。那么django部分通常是一个负担(环境、需要设置的数据库、计算开销)。因此,我们正在寻找一种打开和关闭Django函数的方法 目前,我们有一个通用类iModel,它具有运行框架中任何模型的所有功能,也有一

使用python和django,我们正在创建一个框架来运行许多科学模型。Python运行模型,django用于跟踪状态并创建网页输出。在操作模式下,这很好,因为整个平台(数据库、django可执行文件)都可用。然而,对于新模型的离线创建和测试,我的同事们通常使用独立的代码,与环境没有任何联系。那么django部分通常是一个负担(环境、需要设置的数据库、计算开销)。因此,我们正在寻找一种打开和关闭Django函数的方法

目前,我们有一个通用类iModel,它具有运行框架中任何模型的所有功能,也有一些django调用。ChildClass继承自该类,并包含特定于模型的功能

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()放在一个单独的模块文件中(如上所述),但可能有更好的方法来实现这一点


也许有很多混乱的编码,我可以做到这一点,但我希望你们中的一些人可以引导我进行一些干净的编码实践。欢迎提供任何建议

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

一种方法是:

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

runner().run()

我认为这不足以解决问题。模型以CATmodel.run()启动。那时候正确的父母应该已经在使用了,不是吗?或者有办法解决这个问题?你说的“父母”是什么意思?它会起作用,因为如果standAlone是真的,Django的东西就永远不会被导入,而且就Python而言,它甚至不需要存在于您的计算机上。事实上,通过这种方式,您可以实例化并运行两个完全不相关的类,前提是它们都是duck类型相同的(也就是说,在本例中,它们提供一个run()-方法)。但就我个人而言,我会鼓励一个普通的超级班级。