com*_*com 4 python inheritance class
有一个着名的Python例子
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(B,C):
def go(self):
super(D, self).go()
print("go D go!")
d = D()
d.go()
#go A go!
#go C go!
#go B go!
#go D go!
Run Code Online (Sandbox Code Playgroud)
我有几个问题.第一个是B调用A和C调用A所以我希望A出现两次.第二个问题是关于订单.
从Python 2.3开始,方法解析使用了一种称为C3线性化的算法(从Dylan借来).维基百科有一篇很好的文章.
顾名思义,这个想法是强制方法解析图是一条直线,即使继承图不是.A根据设计,这意味着不会出现两次.
为什么?嗯,首先,它完全避免了在许多其他语言中困扰多重继承的"钻石问题".(或者更准确地说,许多其他语言禁止MI或将其限制为纯粹的"接口",因为它们没有解决问题,因为它存在于C++中.)
最初的Python解释 - 包括它背后的动机 - 可以在Python 2.3 Method Resolution Order中找到.这有点技术性,但如果你有兴趣,值得一读.
您可能还想阅读原始的Dylan论文,其中详细介绍了非线性MRO图表的错误,以及提出单调线性化的挑战(即,它按照您期望的顺序进行,或者在一旦你克服了线性的事实,你所期望的顺序最少,等等.
如果你想深入了解幕后的type()工作方式,或者只是想看看2.3和3.7之间的变化(例如,__mro__创建和更新的方式- 虽然魔术3.x super在其他地方),真的没有比CPython源代码.