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).
我有兴趣创建一个 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).