是的,所以我必须为学校项目创建这个继承层次结构,所以忽略某些冗余(比如Square真的不需要2个父母),我遇到了Python处理超级调用的奇怪方式。
在以下代码中初始化一个正方形时,它会调用它的super,它执行Rectangle的初始化方法。这是有道理的。矩形然后调用它的super,它应该转到Parallelogram的初始化方法;然而,经过一些调试后,我发现当它进行超级调用时,它实际上是在调用Rhombus的初始化方法。有人可以解释这里发生了什么,如果可能的话,可以在不明确使用类名的情况下正确实现这一点吗?
相关代码如下。
class Parallelogram:
def __init__(self, base, side, theta):
self.base = base
self.side = side
self.theta = theta
class Rectangle(Parallelogram):
def __init__(self, base, side):
super(Rectangle, self).__init__(base, side, 90)
class Rhombus(Parallelogram):
def __init__(self, side, theta):
super(Rhombus, self).__init__(side, side, theta)
class Square(Rectangle, Rhombus):
def __init__(self, side):
super(Square, self).__init__(side, side)
答案 0 :(得分:0)
您可以通过调用类对象的mro检查继承的执行顺序
In [257]: Square.__mro__
Out[257]:
(__main__.Square,
__main__.Rectangle,
__main__.Rhombus,
__main__.Parallelogram,
object)