python3中'super'的继承

时间:2017-05-30 10:22:56

标签: python

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

1 个答案:

答案 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() - 首先它调用showD的实现,除了将此调用进一步委托给B之外什么都不做。类B第一次将此调用委托给C(请参阅mro列表),该A将其进一步委托给"A",其中C打印,然后"C"打印{{ 1}}然后B打印"B"

您可能会问 - 为什么B委托给C代替A(因为B延伸A,而不是C。这实际上是故意的,有关详细信息,请查看此great talk