我尝试使用协作多重继承模式来解决问题。我的python 2.7代码的一个非常简化的版本如下所示:
class Base1(object):
def __init__(self, a, b):
self.a = a
self.b = b
def to_tuple(self):
return self.a, self.b
def to_string(self):
return '%s.%s' % self.to_tuple() # (1)
class Base2(object):
def __init__(self, c, d):
self.c = c
self.d = d
def to_tuple(self):
return self.c, self.d
def to_string(self):
return '%s-%s' % self.to_tuple() #(2)
class MyMixin(Base1, Base2):
def __init__(self, a, b, c, d):
Base1.__init__(self, a, b)
Base2.__init__(self, c, d)
def to_tuple(self):
return Base1.to_tuple(self) + Base2.to_tuple(self)
def to_string(self):
return '{}: {} '.format(Base1.to_string(self), Base2.to_string(self))
mix = MyMixin('a', 'b', 'c', 'd')
print(mix.to_string())
编写此代码后,我期待结果:
a.b: c-d
但代码失败了。运行第#(1)
行时,self
是MyMixin
类,而不是Base1
类,因此to_tuple
会返回4个项目。
我发现解决此问题的唯一方法是将上面的行#(1)
和#(2)
替换为:
return '%s.%s' % Base1.to_tuple() # (1)
return '%s.%s' % Base2.to_tuple() # (2)
由于种种原因,这感觉非常错误。
我做错了什么?
答案 0 :(得分:2)
以下是发生的事情。调用mix.to_string()
时,首先调用Base1.to_string(self)
将mix
实例作为self传递,这意味着在Base1上调用to_string时,它有一个MyMixin
实例返回to_tuple
电话上的''a','b','c','d')。这就是它失败的原因,因为元组包含4个项目,而第1行只需要2个。
要解决此问题,请尝试避免使用相同方法签名从多个类继承。改为使用构图。
class MyMixin(object):
def __init__(self, a, b, c, d):
self.base1 = Base1(a, b)
self.base2 = Base2(c, d)
def to_tuple(self):
return self.base1.to_tuple(self) + self.base2.to_tuple(self)
def to_string(self):
return '{}: {} '.format(self.base1.to_string(), self.base2.to_string())