Python()不应该工作吗?

2024-10-06 06:49:48 发布

您现在位置:Python中文网/ 问答频道 /正文

据我所知,以及我在网上找到的所有东西,这应该行得通(但事实并非如此,这就是我为什么要问这个问题;)

class Tigon(Crossbreeds, Predator, Lion):

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

“杂交种”和“捕食者”都是从“哺乳动物”继承的,“狮子”是从“捕食者”继承的。那些作品的汇编很好。我正在开发Python 3.2,不过我也尝试了前面的:

编辑:抱歉,我的一部分帖子因为某种原因没有通过。在

我也试过:

^{pr2}$

他们俩都给了我:

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

有什么建议吗?在


Tags: selfinitdefclass事实printsuperhuge
3条回答

应该是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()

由于狮子是一种掠食者,所以这个选择是等价的:

^{pr2}$

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

简而言之:不要直接或间接地继承同一个基类,但是在之后直接继承应该可以。所以不要继承Predator,也不要在Lion之后继承它。在

嗯,C3 MRO似乎找不到与所有约束一致的顺序。限制条件是:

  • 每个类必须在基类之前到达
  • 基类必须按它们列出的顺序排列。在

您按该顺序继承CrossbreedsPredator和{},因此它们的方法必须按该顺序调用。必须在

相关问题 更多 >