python - 动态更改基类 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 个属性就可以了。但是对于所有/大多数属性来说不是很难吗?
解决方案
您所描述的(使用函数来选择类)类似于使用工厂,但缺点是每次运行时都要重新制作类。这会混淆类型检查/比较。一般来说,您应该只创建每个类对象一次。
如果您想从LongModel
类内部控制此行为,可以通过覆盖其__new__
方法来实现,如下所述:https ://stackoverflow.com/a/10357472/5946921
但是,我不建议您这样做,因为它很可能是糟糕的设计。您绝对应该预先生成所有类,然后重新使用这些类对象,以防止以后出现类型检查/比较问题。此外,请考虑为此使用组合而不是继承。
推荐阅读
- bash - 运行执行另一个 shell 脚本的 shell 脚本时,Cygwin 给出“没有这样的文件或目录”错误
- c++ - 使用一个类中的对象作为另一个类的对象 c++
- bash - 是否可以使用 bash 在一列中找到具有重复值但在其他列中没有重复值的数据?
- mysql - 如何使用一个触发器执行多个操作
- c++ - 用 string_view 构造 istringstream 不会编译
- javascript - 下拉列表的第一项未定义
- game-maker - 数字模数加法的函数(如度数)
- c# - 我怎样才能将ActionLink“添加图片”放在导航栏的中间?
- javascript - 如何向此代码添加一个函数,使我能够从下拉菜单中选择选项?
- python - 如何使用python从本地网站获取数据