2011-05-19 92 views
6

至于我可以告诉大家,一切我一直在网上寻找,这应该工作(但它没有,这就是为什么我问这里;))Python超级() - 应该工作,但不是?

class Tigon(Crossbreeds, Predator, Lion): 

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

两个“杂种”和“捕食者”从“哺乳动物”继承,而“狮子”从Predator继承。这些工作的汇编很好。我正在使用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 

有什么建议?

+0

你必须写什么不工作,所以我们可以帮助。 'super()'通常需要参数:http://docs.python.org/library/functions.html#super – viraptor 2011-05-19 10:58:33

+0

对不起,部分帖子没有通过。现在编辑 – BIU 2011-05-19 11:02:07

+0

@viraptor:python 3中的super()不需要参数(尽管它仍然可以接受它们),并且如果没有参数指定它们可能是有意义的。 – 2011-05-19 11:02:15

回答

0

应该是super().__init__(self)

编辑: 我道歉,你应该把Lion前:

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

这给了我同样的错误 – BIU 2011-05-19 11:05:35

+0

@Jan - 你能告诉问题是什么吗? – BIU 2011-05-19 11:06:18

+0

@BIU:现在应该工作 – Kabie 2011-05-19 11:10:39

7

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

那么,C3 MRO似乎无法找到与所有约束一致的任何顺序。约束条件是:

  • 每个班必须拿出它的基类
  • 和基类之前必须进来,他们列出的顺序。

你继承Crossbreeds,依次PredatorLion,使他们的方法必须按照这个顺序被调用。但由于Lion继承Predator,它的方法必须在Predator之前调用。这是不可能的,因此它说它不能创建一致的方法解析顺序。

+0

谢谢!我知道了。这意味着'(Crossbreeds,Lion,Predator)'应该可以工作,对吧? 这给了我另外一个问题 - 使用这个措辞,如果我想'Tigon'继承'Lion'和'Predators'中定义不同的方法,我希望'Tigon'从'Predators '? – BIU 2011-05-19 11:22:47

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() 

这种替代是等价的,因为狮子是一个铁血战士:

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

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

+0

请参阅[Jan的答案](http://stackoverflow.com/questions/6057540/python-super-should-be-working-but-isnt/6057743#6057743)了解为什么 – 2011-05-19 11:28:17

相关问题