多重继承和多级继承

时间:2017-11-24 22:19:36

标签: python python-3.x

是的,所以我必须为学校项目创建这个继承层次结构,所以忽略某些冗余(比如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)

1 个答案:

答案 0 :(得分:0)

您可以通过调用类对象的mro检查继承的执行顺序

In [257]: Square.__mro__
Out[257]: 
(__main__.Square,
 __main__.Rectangle,
 __main__.Rhombus,
 __main__.Parallelogram,
 object)