Python多重继承超级函数校准顺序

时间:2019-07-24 01:33:26

标签: python

我想知道enter C enter A leave A leave C的顺序如此热门吗? 谁叫C.__init__()?为什么在B之后紧接A?

class A():
    def __init__(self):
        print('enter A')
        print('leave A')


class B(A):
    def __init__(self):
        print('enter B')
        super().__init__()
        print('leave B')


class C(A):
    def __init__(self):
        print('enter C')
        super().__init__()
        print('leave C')


class D(B, C):
    def __init__(self):
        print('enter D')
        super().__init__()
        print('leave D')


d = D()

结果如下:

enter D
enter B
enter C
enter A
leave A
leave C
leave B
leave D

1 个答案:

答案 0 :(得分:0)

这是因为super().__init__的位置,它位于两个print函数的中间,这会将它发送到print之前要离开课程的另一个课程,所以做

class A():
    def __init__(self):
        print('enter A')
        print('leave A')

class B(A):
    def __init__(self):
        print('enter B')
        print('leave B')
        super().__init__()

class C(A):
    def __init__(self):
        print('enter C')
        print('leave C')
        super().__init__()

class D(B, C):
    def __init__(self):
        print('enter D')
        print('leave D')
        super().__init__()


d = D()

输出:

enter D
leave D
enter B
leave B
enter C
leave C
enter A
leave A

又为什么在B之前A,因为它首先处理两个子类,请参阅@chepner的注释以获取更多信息。