Python super() - 应该工作但不是吗?

时间:2011-05-19 10:53:13

标签: python multiple-inheritance

就我所知,以及我在网上找到的所有内容,这应该有效(但事实并非如此,这就是我在这里问的原因;)

class Tigon(Crossbreeds, Predator, Lion):

    def __init__(self):
        super().__init__()
    def printSize(self):
        print("Huge")

“杂交种”和“捕食者”都继承自“哺乳动物”,“狮子”继承自“捕食者”。编译的工作正常。我正在研究Python 3.2,虽然我也尝试过早些时候:

编辑:对不起,部分帖子由于某种原因没有通过。

我也尝试过:

class Tigon(Crossbreeds, Predator, Lion):

    def __init__(self):
        super(Tigon, self).__init__()
    def printSize(self):
        print("Huge")

他们俩都给了我:

class Tigon(Crossbreeds, Predator, Lion):
TypeError: Cannot create a consistent method resolution
order (MRO) for bases Predator, Mammal, Lion

有什么建议吗?

3 个答案:

答案 0 :(得分:7)

简短回答:不要直接或间接地继承相同的基类,但是间接继承之后间接继承应该有效。因此,请勿在 Predator之后继承Lion或继承

嗯,C3 MRO似乎无法找到与所有约束一致的任何订单。限制是:

  • 每个班级必须在它的基础课程之前
  • 并且基类必须按列出的顺序排列。

您按顺序继承CrossbreedsPredatorLion,因此必须按此顺序调用其方法。但由于Lion继承了Predator,因此必须在Predator之前调用它的方法。这是不可能的,因此它表示无法创建一致的方法解析顺序。

答案 1 :(得分:0)

应为super().__init__(self)

编辑: 我很抱歉,你应该把Lion放在前面:

class Tigon(Lion, Predator, Crossbreeds):
    def __init__(self):
        super().__init__()

答案 2 :(得分:0)

如果我正确理解了您描述的继承模型,那么您应该如何定义Tigon类:

class Mammal(object):
    def __init__(self):
        super(Mammal, self).__init__()

class Crossbreeds(Mammal):
    def __init__(self):
        super(Crossbreeds, self).__init__()

class Predator(Mammal):
    def __init__(self):
        super(Predator, self).__init__()

class Lion(Predator):
    def __init__(self):
        super(Lion, self).__init__()

class Tigon(Lion, Crossbreeds, Predator):
    def __init__(self):
        super(Tigon, self).__init__()

t = Tigon()

这个替代方案是等价的,因为Lion是一个捕食者:

class Tigon(Lion, Crossbreeds):
    def __init__(self):
        super(Tigon, self).__init__()

现在这是一个快速的规则。每个类的构造函数在基类之后调用,但它们必须在类定义中以反向顺序出现。此外,覆盖其父类中定义的方法的类必须首先出现在类定义中 - 这意味着如果要覆盖Lion中的Predator方法,Lion应该出现在定义中的Predator之前。对此的更长解释是Jan Hudec's answer