首页 > 解决方案 > 动态更改基类 Python?

问题描述

假设我有 4 个班级class ModelA, class ModelB, class ModelC class ModelD.

我还有一个class LongModel。我想从上面的 4 个类中选择一个作为 BaseClass 的class LongModel,基于model_name. 什么是正确的方法。截至目前,我正在执行以下操作:

def get_long_model(model_name):
   if model_name == 'A':
       base_class = Model_A
   if model_name == 'B':
       base_class = Model_B
   if model_name == 'C':
       base_class = Model_C
   if model_name == 'D':
       base_class = Model_D
   
   return LongModel(base_class)

我真的不想使用函数。我们可以在LongModel自身上做到这一点吗?

例如:

class LongModel():
    def __init__(self, model_name):
        if model_name == 'A':
             # Assign base class for LongModel

或使用类或任何东西的巧妙方式。

如果我使用组合,

class LongModel():
    def __init__(self, model):
        self.model = model

long_model = LongModel(ModelA)

然后,假设 ModelA 有一些属性,我想在里面LongModel说名称,我必须添加self.name = model.name,对于一个或 2 个属性就可以了。但是对于所有/大多数属性来说不是很难吗?

标签: pythonpython-3.xinheritanceabstract-class

解决方案


您所描述的(使用函数来选择类)类似于使用工厂,但缺点是每次运行时都要重新制作类。这会混淆类型检查/比较。一般来说,您应该只创建每个类对象一次。

如果您想从LongModel类内部控制此行为,可以通过覆盖其__new__方法来实现,如下所述:https ://stackoverflow.com/a/10357472/5946921

但是,我不建议您这样做,因为它很可能是糟糕的设计。您绝对应该预先生成所有类,然后重新使用这些类对象,以防止以后出现类型检查/比较问题。此外,请考虑为此使用组合而不是继承。


推荐阅读