余敏丰 发表于 2020-4-8 16:20:45

Python的super()函数

在多重继承中使用super()函数,求问为什么输出结果是这个顺序?这个到底是怎样的运行过程?
class A():
    def __init__(self):
      print("进入A…")
      print("离开A…")

class B(A):
    def __init__(self):
      print("进入B…")
      super().__init__()
      print("离开B…")
      
class C(A):
    def __init__(self):
      print("进入C…")
      super().__init__()
      print("离开C…")

class D(B, C):
    def __init__(self):
      print("进入D…")
      super().__init__()
      print("离开D…")

>>> d = D()
进入D…
进入B…
进入C…
进入A…
离开A…
离开C…
离开B…
离开D…

编程鱼C 发表于 2020-4-8 16:23:00

你的程序是:从下到上再从上到下

qiuyouzhi 发表于 2020-4-8 16:23:59

>>> print(D.__mro__)
自己打印看结果

余敏丰 发表于 2020-4-8 16:24:52

编程鱼C 发表于 2020-4-8 16:23
你的程序是:从下到上再从上到下

???没有太清楚,请问可以再详细一点吗?

永恒的蓝色梦想 发表于 2020-4-8 16:26:58

编程鱼C 发表于 2020-4-8 16:23
你的程序是:从下到上再从上到下

你这不是废话?

余敏丰 发表于 2020-4-8 16:27:40

qiuyouzhi 发表于 2020-4-8 16:23
自己打印看结果

print的结果是这样的,所以应该是先运行D,再到B,再到C,再到A?那返回的时候为啥是先返回C?(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)

qiuyouzhi 发表于 2020-4-8 16:28:31

余敏丰 发表于 2020-4-8 16:27
print的结果是这样的,所以应该是先运行D,再到B,再到C,再到A?那返回的时候为啥是先返回C?(, , , , )

按顺序来嘛
进入顺序是DBCA,出去就是把DBCA反过来
也就是ACBD

余敏丰 发表于 2020-4-8 16:34:00

qiuyouzhi 发表于 2020-4-8 16:28
按顺序来嘛
进入顺序是DBCA,出去就是把DBCA反过来
也就是ACBD

多谢大佬!
下面这个代码print('D__mro__')和上面那个一样
class A():
    def __init__(self):
      print("进入A…")
      print("离开A…")

class B(A):
    def __init__(self):
      print("进入B…")
      print("离开B…")
      
class C(A):
    def __init__(self):
      print("进入C…")
      print("离开C…")

class D(B, C):
    def __init__(self):
      print("进入D…")
      super().__init__()
      print("离开D…")
但输出结果是
进入D…
进入B…
离开B…
离开D…
请问一下这个是为什么?

编程鱼C 发表于 2020-4-8 16:36:45

余敏丰 发表于 2020-4-8 16:34
多谢大佬!
下面这个代码print('D__mro__')和上面那个一样
class A():


yes

qiuyouzhi 发表于 2020-4-8 16:36:56

余敏丰 发表于 2020-4-8 16:34
多谢大佬!
下面这个代码print('D__mro__')和上面那个一样
class A():


D的super()函数优先调用写在前面的父类的方法,
所以:
打印进入D后,进入B,进入B后,没有super什么的,
所以继续往下走,到离开B,这时B的__init__也走完了
就打印离开B了

余敏丰 发表于 2020-4-8 16:39:28

qiuyouzhi 发表于 2020-4-8 16:36
D的super()函数优先调用写在前面的父类的方法,
所以:
打印进入D后,进入B,进入B后,没有super什么的 ...

那C就不会运行了吗?可是第一道钻石继承的问题里面C明明也运行了呀?{:9_241:}

qiuyouzhi 发表于 2020-4-8 16:43:00

余敏丰 发表于 2020-4-8 16:39
那C就不会运行了吗?可是第一道钻石继承的问题里面C明明也运行了呀?

不会运行了,因为B里面没有写super

余敏丰 发表于 2020-4-8 16:44:29

qiuyouzhi 发表于 2020-4-8 16:43
不会运行了,因为B里面没有写super

大概懂了,多谢大佬!
页: [1]
查看完整版本: Python的super()函数