【发布时间】:2021-08-30 10:22:00
【问题描述】:
假设我有 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 个属性是可以的。但是对于所有/大多数属性是不是很困难?
【问题讨论】:
-
我认为这是composition over inheritence 的好时机,意思是不要换掉基类(继承),而是应该换掉类的成员变量
-
你能给我一个基本的布局例子吗?
-
显然继承是在
class LongModel(BaseClass):中完成的,所以不,你不能做你想做的事。使用组合。 -
只有一个
LongModel类对象。您不能动态地切换它的基数,因为这会针对LongModel的每个实例更改它。这根本不是这种关系的运作方式。 -
@SarathRNair 共享属性可以在外部类中定义,而不被所有人共享的具体属性可以在内部类中定义。如果存在仅与某些类共享的属性,请考虑为那些使用继承或组合的中间类酌情使用。
标签: python python-3.x inheritance abstract-class