【发布时间】:2018-04-16 16:24:59
【问题描述】:
我以为我想改变一个类的继承,但后来我读到了这个How to dynamically change base class of instances at runtime?,它说这是一个坏主意。我学到了一个艰难的方法,当很多人在 SO 上说不要这样做但你还是这样做了,那么你最终会后悔的。但是,我正在努力寻找如何避免它。所以我想提出我的问题,看看是否有人对如何克服这个问题有任何意见。
我有两个库 Frame 和 Imp。
框架:
Frame 是类的集合,它们充当开发工具的一种框架。
这个库中有五个类。
Frame.A(metaclass=ABCMeta):
是一个抽象类,一切都将从中继承。
下一级分为两种类型的对象:
Frame.B(A) 和 Frame.C(A)。
Frame.C 没有更多的孩子,但Frame.B 有并再次分叉:
Frame.D(B) 和 Frame.E(B)。
小鬼:
我们决定要使用Frame 框架来创建特定的工具并创建两个类
Imp.A(Frame.D) 和 Imp.B(Frame.E) 对象。然而事实证明,我们在Imp.A 和Imp.B 中创建了许多相同的方法。
由于我们不想要大量重复的代码,我们考虑添加一个具有公共方法的类,因此 Imp.A 和 Imp.B 都可以继承自。问题是这些函数太具体了,不能放在 Frame 库中,在 Imp 库中没有 Frame.D 和 Frame.E 是没有意义的。
可以在Imp 中创建Frame.D (Imp.FD) 和Frame.E (Imp.FE) 的精确副本,再加上新的基类(Imp.New),因此我们具有以下结构:
Imp.New(Frame.B)
Imp.FD(Imp.New)
Imp.FE(Imp.New)
Imp.A(Imp.FD)
Imp.B(Imp.FE)
但是,我们现在有两个类(Imp.FD = Frame.D 和 Imp.FE = Frame.E)的两个(几乎相同)副本,这使得开发等有点痛苦。
如果我可以创建Imp.New(Frame.B) 并使用Frame.D 和Frame.E,但只需修改为从Imp.New 继承而不是Frame.B,那将是完美的。但是,显然这是不好的做法:How to dynamically change base class of instances at runtime?
谁能建议我的问题的解决方案?
补充:
Pass a parent class as an argument? 接受的答案显示了一种在函数内定义类的方法,以便可以选择父类。我可以使用这种技术,让Frame.D 和Frame.E 都有可变的父类,但感觉有点笨拙,当人们使用它时它不会弄乱帮助函数/文档字符串吗?
这似乎不是什么特别的情况,这种事情肯定有一些协议吗?
【问题讨论】:
标签: python python-3.x oop