首页 > 解决方案 > 了解python的多重继承

问题描述

我有以下代码片段

class Test(object):
    def check(self, x):
        x = x + 10
        return x

class Test1(object):
    def check(self, x):
        x = super().check(x)
        x = x + 2
        return x

class Test2(Test1, Test):
    pass


a = Test2()
print (a.check(2))

当我运行代码时,它输出 14

我的问题是由于 Test1 在我使用 super() 方法时没有任何父级,为什么它调用 Test 类的 check 方法?

因为它调用 Test x 的检查方法将 12,然后 Test1 的检查方法将使其成为 14

所以我试图了解发生了什么

标签: python-3.x

解决方案


为了解析方法check(x),python 使用方法解析排序(MRO)来实现完整的继承层次结构。这意味着 Python 以深度优先的方式从左到右遍历层次结构树。

x = super().check(x)通过调用Test2,Python 找到第二个基类的方法Test并调用该函数。

请注意,子类的继承顺序至关重要。例如引入第三个测试类,Test2它将是

class Test3(object):
def check(self, x):
    x = x + 38
    return x

例如Test2,将按照这个特定的顺序继承Test2(Test1, Test, Test3),结果仍然是 14,但如果Test2(Test1, Test3, Test1)看起来像这样,答案将是 42。

进一步阅读MRO。


推荐阅读