可以使用MRO来覆盖mixin吗?

时间:2015-02-01 19:16:47

标签: python python-3.x multiple-inheritance mixins

问题描述:我有一个继承自mixins CA的课程B。 我想要一个新类C_,其中包含在类C中定义的所有方法/属性,但在继承方案中使用BB_(相同的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),但我的直觉说它不一定会更漂亮。

2 个答案:

答案 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