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…
你的程序是:从下到上再从上到下 >>> print(D.__mro__)
自己打印看结果 编程鱼C 发表于 2020-4-8 16:23
你的程序是:从下到上再从上到下
???没有太清楚,请问可以再详细一点吗? 编程鱼C 发表于 2020-4-8 16:23
你的程序是:从下到上再从上到下
你这不是废话? 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'>) 余敏丰 发表于 2020-4-8 16:27
print的结果是这样的,所以应该是先运行D,再到B,再到C,再到A?那返回的时候为啥是先返回C?(, , , , )
按顺序来嘛
进入顺序是DBCA,出去就是把DBCA反过来
也就是ACBD 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…
请问一下这个是为什么? 余敏丰 发表于 2020-4-8 16:34
多谢大佬!
下面这个代码print('D__mro__')和上面那个一样
class A():
yes 余敏丰 发表于 2020-4-8 16:34
多谢大佬!
下面这个代码print('D__mro__')和上面那个一样
class A():
D的super()函数优先调用写在前面的父类的方法,
所以:
打印进入D后,进入B,进入B后,没有super什么的,
所以继续往下走,到离开B,这时B的__init__也走完了
就打印离开B了 qiuyouzhi 发表于 2020-4-8 16:36
D的super()函数优先调用写在前面的父类的方法,
所以:
打印进入D后,进入B,进入B后,没有super什么的 ...
那C就不会运行了吗?可是第一道钻石继承的问题里面C明明也运行了呀?{:9_241:} 余敏丰 发表于 2020-4-8 16:39
那C就不会运行了吗?可是第一道钻石继承的问题里面C明明也运行了呀?
不会运行了,因为B里面没有写super
qiuyouzhi 发表于 2020-4-8 16:43
不会运行了,因为B里面没有写super
大概懂了,多谢大佬!
页:
[1]