有人可以解释给定代码的输出以及 python MRO 在这种情况下如何工作吗?
class A(object):
def go(self):
print("go A go!")
class B(A):
def go(self):
super(B, self).go()
print("go B go!")
class C(A):
def go(self):
super(C, self).go()
print("go C go!")
class D(C, B):
def go(self):
super(D, self).go()
print("go D go!")
d = D()
d.go()
Output:
go A go!
go B go!
go C go!
go D go!
按照从左到右和深度,我认为应该是:
go A go!
go C go!
go D go!
但似乎它并不像我想象的那样工作。
班级的 MRO 基于其父级的 MRO:
>>> A.__mro__
(<class '__main__.A'>, <class 'object'>)
>>> B.__mro__
(<class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
>>> C.__mro__
(<class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
>>> D.__mro__
(<class '__main__.D'>, <class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
The 三个规则 are:
- 孩子先于父母:
- 一个
- B < A
- C < A
- D < C
- D < B
- 父母按碱基顺序排列:
- 父 mros 被合并,保留它们的顺序。
- merge
B < A < object
with C < A < object
在 Python 2 的早期,搜索规则曾经是深度优先左非右,但基于对 C3 线性化算法的研究,这种规则发生了变化。
See the 超级考虑超级有关在实际代码中利用该算法的方法的博客文章。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)