python-3.x - 了解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
所以我试图了解发生了什么
解决方案
为了解析方法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。
推荐阅读
- authentication - PWA离线登录,可以吗?
- c# - 将 .h5 内容从 IFormFile 转换为 JSON
- spring - 性能调优 Spring RestTemplate
- php - 如何修复 #1932 - 引擎中不存在表
- javascript - 根据 mysql 数据库中的下拉选择更改内容
- jquery - 如何使用 jQuery 和 Ajax 对 DreamFactory 进行基本身份验证
- python - Python Pymongo 没有更新现有文档
- amazon-web-services - 为联合身份用户创建 URL 以访问 AWS 管理控制台
- c# - 如何在下面的按钮中使用 Thread
- javascript - 正则表达式匹配末尾带有特殊字符的单词