是的,所以我必须为一个学校项目创建继承层次结构,所以忽略了某些冗余(比如Square实际上不需要两个父母),我遇到了一种奇怪的Python处理超级调用的方式。
当在下面的代码中初始化一个正方形时,它调用它的super,后者执行矩形的初始化方法。这是有道理的。然后矩形调用它的超级函数,这个函数应该转到平行四边形的初始化方法;然而,经过一些调试后,我发现当它进行超级调用时,它实际上是在调用菱形的初始化方法。有人能解释一下这里发生了什么吗?如果可能的话,有一种方法可以在不显式使用类名的情况下正确实现这一点吗?
相关代码如下。
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)发布于 2017-11-25 07:10:36
您可以通过调用类对象的mro检查继承的执行顺序
In [257]: Square.__mro__
Out[257]:
(__main__.Square,
__main__.Rectangle,
__main__.Rhombus,
__main__.Parallelogram,
object)https://stackoverflow.com/questions/47480649
复制相似问题