多重继承 - Python super() - 应该可以工作,但不是吗?



据我所知,以及我在网上找到的所有内容,这应该有效(但它没有,这就是为什么我在这里问;)

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

有什么建议吗?

简短回答:不要直接和间接继承相同的基类,但在间接之后直接继承应该有效。所以不要继承Predator,也不要继承Lion之后

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

  • 每个类都必须在其基类之前
  • 基类必须按其列出的顺序出现。

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

应该super().__init__(self) .

编辑:对不起,你应该把Lion前面:

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

如果我正确理解了您描述的继承模型,那么您应该如何定义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()

这种选择是等价的,因为狮子是捕食者:

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

现在这里有一个快速的规则。每个类的构造函数在基类之后调用,但它们必须在类定义中以相反的顺序出现。此外,重写其父类中定义的方法的类必须首先出现在类定义中 - 这意味着如果要重写 Lion 中的 Predator 方法,Lion 应该出现在定义中的 Predator 之前。对此的较长解释在Jan Hudec的回答中。

最新更新