据我所知,以及我在网上找到的所有内容,这应该有效(但它没有,这就是为什么我在这里问;)
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 似乎无法找到与所有约束一致的任何订单。限制条件是:
- 每个类都必须在其基类之前
- 基类必须按其列出的顺序出现。
您按该顺序继承Crossbreeds
、Predator
和Lion
,因此必须按该顺序调用它们的方法。但是由于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的回答中。