就我所知,以及我在网上找到的所有内容,这应该有效(但事实并非如此,这就是我在这里问的原因;)
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
有什么建议吗?
答案 0 :(得分:7)
简短回答:不要直接或间接地继承相同的基类,但是间接继承之后间接继承应该有效。因此,请勿在 Predator
之后继承Lion
或继承。
嗯,C3 MRO似乎无法找到与所有约束一致的任何订单。限制是:
您按顺序继承Crossbreeds
,Predator
和Lion
,因此必须按此顺序调用其方法。但由于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。