合作多重继承和Python 2.7混合蛋白



我正在尝试使用合作的多重继承模式来解决问题。我的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)运行时,selfMyMixin类,而不是Base1类,因此to_tuple返回4个项目。

我发现解决此问题的唯一方法是上面替换#(1)#(2)的行:

return '%s.%s' % Base1.to_tuple()    # (1)
return '%s.%s' % Base2.to_tuple()    # (2)

出于多种原因,这感觉非常错误。

我在做什么错?

这就是发生的事情。首先,当调用mix.to_string()时,它将Base1.to_string(self)称为 mix实例作为一个自我,这意味着当base1上调用to_string时,它具有 MyMixin的实例,它返回('a'','b','c','c','d'(在to_tuple呼叫上。这就是为什么失败的原因,cuz元组包含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())

最新更新