Python 方法解析顺序
Python Method Resolution Order
有人可以解释给定代码的输出以及 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()
输出:
go A go!
go B go!
go C go!
go D go!
按照从左到右和深度我会说应该是:
go A go!
go C go!
go D go!
但似乎并没有像我想的那样工作。
class 的 MRO 是基于 parents 的 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'>)
three rules 是:
- Children 走在 parents:
之前
- A < object
- B < A
- C < A
- D < C
- D < B
- Parents 按碱基顺序排列:
- C < B
- Parent mros 被合并,保留它们的顺序。
- 合并
B < A < object
与 C < A < object
在Python2的早期,搜索规则曾经是depth-first-left-ot-right,但是根据对C3线性化算法的研究改变了。
请参阅 Super Considered Super 博客 post 了解在实际代码中利用此算法的方法。
有人可以解释给定代码的输出以及 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()
输出:
go A go!
go B go!
go C go!
go D go!
按照从左到右和深度我会说应该是:
go A go!
go C go!
go D go!
但似乎并没有像我想的那样工作。
class 的 MRO 是基于 parents 的 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'>)
three rules 是:
- Children 走在 parents: 之前
- A < object
- B < A
- C < A
- D < C
- D < B
- Parents 按碱基顺序排列:
- C < B
- Parent mros 被合并,保留它们的顺序。
- 合并
B < A < object
与C < A < object
在Python2的早期,搜索规则曾经是depth-first-left-ot-right,但是根据对C3线性化算法的研究改变了。
请参阅 Super Considered Super 博客 post 了解在实际代码中利用此算法的方法。