Python 中绑定对象槽的多重继承和混合

Multiple-inheritance and mixins to bind object slots in Python

我有兴趣创建一个 class 层次结构,其中包含各种混合 在对象中创建插槽:

class A(object, Keyable, Taggable):
    """A is keyable and taggable."""
    def __init__(self):
        super(A, self).__init__()
        print "A"

class B(BodyText, Valuable):
    """B is everything a A is, plus Valuable"""
    def __init__(self):
        super(B, self).__init__()
        print "B"

class C(BodyKey, Posable):
    """C is everything a B is, plus Posable"""
    def __init__(self):
        super(C, self).__init__()
        print "C"

然而,当我尝试 运行 这段代码(连同下面的混入) 我收到错误“””无法创建一致的方法解析 碱基可键控、可标记、对象“”的订单 (MRO)”

如果有不同的方式来实现我的目标(比如作文 或其他)我对此持开放态度。

# BEGIN MIXINS
class Posable(object):
    def __init__(self):
        super(Posable, self).__init__()
        self.pos = 0
        print "POSABLE"

class Keyable(object):
    def __init__(self):
        super(Keyable, self).__init__()
        self.key = ''
        print "KEYABLE"

class Taggable(object):
    def __init__(self):
        super(Taggable, self).__init__()
        self.tag = ''
        print "TAGGABLE"

class Valuable(object):
    def __init__(self):
        super(Valuable, self).__init__()
        self.val = 0
        print "VALUABLE"
# END MIXINS

尝试将 mixin 放在首位:

class A(Keyable, Taggable, object):
    ...

实际上,在这种情况下,由于您所有的 mixins 都继承自 object,您真的不需要再这样做:

class A(Keyable, Taggable):
    ...

错误出现是因为当你写:

class A(object, Keyable, Taggable):
   ...

您告诉 python Keyable 在方法解析顺序中(从左到右)在 Taggable 之前,在 object 之前。当然,python构造方法解析顺序的时候,中间可以插入更多的东西,但是最终mro保证是这样的:

[A, object, ...  Keyable, ..., Taggable, ...]

其中 ... 可以是 0 或更多 类。不幸的是,在这种情况下,python 无法构造该 mro,因为 Keyable(和 Taggable)继承自对象(它告诉 python 它们需要在 object 在 mro).