问题描述:我有一个继承自mixins C
和A
的课程B
。
我想要一个新类C_
,其中包含在类C
中定义的所有方法/属性,但在继承方案中使用B
与B_
(相同的API)交换(一个可能的用途是轻松嘲笑)。 所有课程都是新款式。
我通过搞乱继承顺序得到了我想要的东西,因此MRO:
A B B_ B_ A B
\ / / \ \ /
C / \ C
\ / \ /
C1 C2
C1(C,B_) C2(B_,C)
C1.__mro__ = (C1, C , A, B, B_, object)
C2.__mro__ = (C2, B_, C, A, B , object)
C2
方法(在C
类之前继承修改后的mixin)工作毫不奇怪,如果我调用B
mixin中定义的方法,B_
选择了定义。
目前它有效,但我觉得:"手指交叉,我希望不会出现特殊情况并破坏系统!"
问题是:这是一种解决问题的最终解决方法,还是有更好的方法?
PS:我想我可以带上我的火箭筒并创建一个元类来重新定义mro(as said in the official doc),但我的直觉说它不一定会更漂亮。答案 0 :(得分:2)
你的方法应该运作得很好。使用子类来控制MRO并将一个类与另一个类相关联是合法的。
此博客文章提供了几个示例:https://rhettinger.wordpress.com/2011/05/26/super-considered-super/
答案 1 :(得分:0)
你已经知道这很乱。如果A和B(以及因此B')具有共同的属性,则C将从A获得这些属性,而C_将从B _获得它们。
假设你没有在C中定义的任何新方法中使用super(),我会使C成为一个简单的类(没有基础),然后写
class D(C, A, B): pass
class D_(C, A, B_): pass