马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
对python在子类中通过“super”方法调用父类的过程的疑惑
为什么像第二种,就没有进入C,离开C了;第三种没有进入,离开A了
第一种: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…
第二种: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…")
super().__init__()
print("离开C…")
class D(B, C):
def __init__(self):
print("进入D…")
super().__init__()
print("离开D…")
d = D()
第二种结果:
进入D…
进入B…
离开B…
离开D…
第三种: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…")
print("离开C…")
class D(B, C):
def __init__(self):
print("进入D…")
super().__init__()
print("离开D…")
d = D()
第三种结果:
进入D…
进入B…
进入C…
离开C…
离开B…
离开D…
本帖最后由 sunrise085 于 2020-7-14 22:28 编辑
super调用按照__mro__列表顺序调用,你的这个继承中,__mro__列表是:<class '__main__.D'>, <class'__main__.B'>, <class '__main__.C'>, <class '__main__.A'>,<class 'object'>
可以通过 D.__mro__ 查看该列表
我写过一个总结帖
Python细节之6、类的多继承中super函数的调用顺序
你这是菱形继承的问题,小甲鱼也特意写过一个帖子: 多重继承的陷阱:钻石继承(菱形继承)问题
|