Python 使用MRO覆盖混入可以吗?

Python 使用MRO覆盖混入可以吗?,python,python-3.x,multiple-inheritance,mixins,Python,Python 3.x,Multiple Inheritance,Mixins,问题描述:我有一个类C继承自mixinsa和B。 我想要一个新类,C,它拥有类C中定义的所有方法/属性,但是在继承方案中用B替换B(相同的API)(这种方法的一种可能用途是简单的模拟)所有课程都是新风格课程。 我通过扰乱继承顺序得到了我想要的,因此MRO: A B B_ B_ A B \ / / \ \ / C / \ C \ / \ / C1 C2 C1(C,B_)

问题描述:我有一个类
C
继承自mixins
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(),但我的直觉告诉我它不一定会更漂亮。

你已经知道这很混乱。如果A和B(因此B')有共同的属性,那么C将从A获取这些属性,而C_将从B_获取它们

假设您没有在C中定义的任何新方法中使用super(),我将使C成为一个简单类(无基),然后编写

class D(C, A, B): pass
class D_(C, A, B_): pass

你的方法应该很有效。使用子类控制MRO并用一个类与另一个类进行隐藏是合法的


这篇博文举了几个例子:

我看不出有什么问题。用于构建MRO的算法是有文档记录的,因此,您可以依赖于您看到的顺序。注意:如果B_u继承自B,则无论类定义中的顺序如何,它都将在MRO中位于B之前。这不是您的用例,但可能是有人搜索的情况,所以我认为这可能值得一提。我可以理解为什么B_不会从B继承,但请注意,并不是用B_替换B:在B中定义而不是在B_中定义的方法仍然是从B继承的。