鱼C论坛

 找回密码
 立即注册
查看: 788|回复: 6

[已解决]第38讲 课后习题6中 super函数

[复制链接]
发表于 2018-7-29 14:37:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. class A():
  2.     def __init__(self):
  3.         print("进入A…")
  4.         print("离开A…")

  5. class B(A):
  6.     def __init__(self):
  7.         print("进入B…")
  8.         super().__init__()
  9.         print("离开B…")
  10.         
  11. class C(A):
  12.     def __init__(self):
  13.         print("进入C…")
  14.         super().__init__()
  15.         print("离开C…")

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

  21. >>> d = D()
  22. 进入D…
  23. 进入B…
  24. 进入C…
  25. 进入A…
  26. 离开A…
  27. 离开C…
  28. 离开B…
  29. 离开D…
复制代码



在对D类的定义中,D类里面的super()函数的调用顺序是按照什么规则来的呀?怎么不运行,就知道运行的结果?
最佳答案
2018-7-29 14:47:44
一层一层往上(父类),如果同一层,就左边的先

print(进入D)
D super(B,C)
print(进入B) -> print(进入C)
(super(A), super(A)) == super(A) #但是在 C 内部的 A
print(进入A)
print(离开A)
print(离开C) #所以先离开C
print(离开B)
print(离开D)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-7-29 14:47:44 | 显示全部楼层    本楼为最佳答案   
一层一层往上(父类),如果同一层,就左边的先

print(进入D)
D super(B,C)
print(进入B) -> print(进入C)
(super(A), super(A)) == super(A) #但是在 C 内部的 A
print(进入A)
print(离开A)
print(离开C) #所以先离开C
print(离开B)
print(离开D)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2018-7-29 15:03:14 | 显示全部楼层
claws0n 发表于 2018-7-29 14:47
一层一层往上(父类),如果同一层,就左边的先

print(进入D)

那是不是我可以理解为:A是一个层次,BC一个层次,D一个层次。
在D中遇到了super函数 开始调用BC,由于B在左,先调用B,然后B中又遇到了super需要调用A,而此时同级别的C的调用还没完成,所以不从B中进入A的调用,而转而开始C的调用,在C中又遇到了super,且此时BC这个级别的调用都完成了,所以从C进入了A,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-29 16:30:42 | 显示全部楼层
C_zhang 发表于 2018-7-29 15:03
那是不是我可以理解为:A是一个层次,BC一个层次,D一个层次。
在D中遇到了super函数 开始调用BC,由于B ...

差不多,但最好不要这样想。每个对象是独立的,所以不要说 BC 是一个层次。
这里虽然是函数的调用,但还是理解成类的继承,因为不是方法。

叔叔无子,孩子要继承父亲与叔叔的遗产,而叔叔与父亲的遗产是爷爷的。
继承这些遗产之后,可以做些什么? 这里才是方法(一般的函数)

换个比方,孩子可以是继承父亲与母亲的遗产,那么此时,父亲与母亲所继承的遗产就不会是来自于同一个人
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-4 20:10:32 | 显示全部楼层
claws0n 发表于 2018-7-29 14:47
一层一层往上(父类),如果同一层,就左边的先

print(进入D)

没太明白,print(进入B) 之后B里也有super啊,不是还应该向上调用A么?调用完之后再print(进入C)啊,为什么是print(进入B)之后就print(进入C)了呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-4 21:11:51 | 显示全部楼层
过来顶一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-24 09:42:18 | 显示全部楼层
lidongze6 发表于 2018-11-4 20:10
没太明白,print(进入B) 之后B里也有super啊,不是还应该向上调用A么?调用完之后再print(进入C)啊,为什 ...

super()是广度优先而不是深度优先
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-12 15:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表