动态更改Python基类?

问题描述 投票:0回答:2

假设我有4节课

class ModelA
class ModelB
class 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个属性就可以了。但对于所有/大多数属性来说,这不是很困难吗?

python python-3.x inheritance abstract-class
2个回答
1
投票

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

如果您想从

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

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


0
投票




class base : 
    def print(self,x,y) : 
        return x + y 

class drived : 
    def print(self,x,y) : 
        return x + y + 1 


class test(base) : 
    pass 

# this simulate drived(base)
v = type('newdrived' , (drived,base), dict())
i = v()
r = i.print(1,1)
print(r)
assert test.__dict__ == v.__dict__

© www.soinside.com 2019 - 2024. All rights reserved.