class A(object):
def show(self):
print 'A'
class B(A):
def show(self):
super(B,self).show()
print 'B'
class C(A):
def show(self):
#A.__init__(self)
super(C,self).show()
print 'C'
class D(B,C):
def show(self):
super(D,self).show()
d=D()
print d.show()
结果如何:
A
C
B
而不是:
A
B
C
答案 0 :(得分:1)
因为这正是你所要求的)关于c3 linearization的更多信息。短提示 - 超不调用parent方法,而是调用方法,它对应于线性化继承图中的下一个类。
更具体地说:
>>> D.mro()
0: [<class '__main__.D'>,
<class '__main__.B'>,
<class '__main__.C'>,
<class '__main__.A'>,
<class 'object'>
]
这个mro
是一个列表,通过任何类D
的方法将其行为委托给父母(有点说话)会在你调用它时被推送。所以你打电话给D().show()
- 首先它调用show
中D
的实现,除了将此调用进一步委托给B
之外什么都不做。类B
第一次将此调用委托给C
(请参阅mro列表),该A
将其进一步委托给"A"
,其中C
打印,然后"C"
打印{{ 1}}然后B
打印"B"
。
您可能会问 - 为什么B
委托给C
代替A
(因为B
延伸A
,而不是C
。这实际上是故意的,有关详细信息,请查看此great talk