【问题标题】:Dynamically Change Base Class Python?动态更改基类 Python?
【发布时间】:2021-08-30 10:22:00
【问题描述】:

假设我有 4 个班级 class ModelAclass ModelBclass ModelC class ModelD

我还有另一个class LongModel。我想从以上 4 个类中选择作为 class LongModel 的 BaseClass,基于 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 个属性是可以的。但是对于所有/大多数属性是不是很困难?

【问题讨论】:

  • 我认为这是composition over inheritence 的好时机,意思是不要换掉基类(继承),而是应该换掉类的成员变量
  • 你能给我一个基本的布局例子吗?
  • 显然继承是在class LongModel(BaseClass): 中完成的,所以不,你不能做你想做的事。使用组合。
  • 只有一个LongModel 类对象。您不能动态地切换它的基数,因为这会针对 LongModel 的每个实例更改它。这根本不是这种关系的运作方式。
  • @SarathRNair 共享属性可以在外部类中定义,而不被所有人共享的具体属性可以在内部类中定义。如果存在仅与某些类共享的属性,请考虑为那些使用继承或组合的中间类酌情使用。

标签: python python-3.x inheritance abstract-class


【解决方案1】:

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

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

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

【讨论】:

  • 之所以这么想是因为如果我定义class LongModelAclass LongModelB等等,本质上不是多余的吗?以后如果我有更多像Model N这样的模型,我必须不断地重写它们。
  • 您可以使用type 等方法动态生成您的类。重要的是您对每种逻辑类型只执行一次。见:stackoverflow.com/questions/15247075
  • 我选择了作曲
猜你喜欢
  • 2015-08-24
  • 2019-03-20
  • 1970-01-01
  • 2012-03-03
  • 1970-01-01
  • 1970-01-01
  • 2017-07-21
  • 1970-01-01
  • 2017-11-05
相关资源
最近更新 更多