【问题标题】:Multiple-inheritance and mixins to bind object slots in Python多继承和混合在 Python 中绑定对象槽
【发布时间】:2015-07-03 17:34:29
【问题描述】:

我有兴趣创建一个包含各种 mixin 的类层次结构 在对象中创建槽:

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"

但是,当我尝试运行此代码时(以及下面的 mixins) 我收到错误“””无法创建一致的方法解决方案 基类 Keyable、Taggable、对象 """ 的顺序 (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

【问题讨论】:

  • 您根本不需要从 A 类中的对象继承。另请注意,您的问题中没有定义 BodyText 和 BodyKey。

标签: python oop multiple-inheritance mixins


【解决方案1】:

尝试将 mixins放在首位

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

实际上,在这种情况下,由于您所有的 mixin 都继承自 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 他们需要在 mro 中的 object 之前出现)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-23
    • 2012-01-19
    • 2017-04-27
    • 2020-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多