鱼C论坛

 找回密码
 立即注册
楼主: sunrise085

[技术交流] Python细节之6、类的多继承中super函数的调用顺序

[复制链接]
发表于 2020-5-13 20:05:57 | 显示全部楼层
666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-15 06:09:20 | 显示全部楼层
哎呦,恭喜加精
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-15 07:59:59 From FishC Mobile | 显示全部楼层
这就厉害了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-15 08:58:40 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-15 09:22:06 | 显示全部楼层
类这里小甲鱼没看懂.java也没看懂,算了算了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-15 09:49:57 | 显示全部楼层
Pythonnewers 发表于 2020-5-15 09:22
类这里小甲鱼没看懂.java也没看懂,算了算了

你多大了?
可能是你太年轻了,还没有办法理解这种抽象的概念吧。
不要把类想象的有多么神秘。
你就想像着,世间万物都是按照各种规则分类的,符合同一种规则的就属于一类。
比如说,三角形,就是一类图形,这种图形是一种平面图形,有三条边,三个顶点,这些是共性,凡是有三个顶点三条边的平面图形就称之为三角形。

其实小学就开始学习归类了,比如小学会有分类题目,将一些图形分类,哪些是三角形,哪些是正方形,哪些是平行四边形。
只是那时候看到的都是很浅显的东西,都是实实在在存在的东西。如今把归类抽象化了。需要发挥有点想象力。

其实在编程中开始接触类的时候,也是哪一些简单的进行举例的,比如说,编程中经常举的例子,学生类,这个类有什么属性呢,学号、姓名、班级、性别、成绩等等
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-15 10:07:09 | 显示全部楼层
sunrise085 发表于 2020-5-15 09:49
你多大了?
可能是你太年轻了,还没有办法理解这种抽象的概念吧。
不要把类想象的有多么神秘。

是的,我还小
最主要我写的代码太少了,甚至可以直接推翻重做,分类我几乎用不到
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-30 10:46:27 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-3 20:22:36 | 显示全部楼层
QQ截图20200603202009.jpg

楼主你好 ,我想问下class F中是 super(G,self).__init__(),那 按__mro__() 列表中G的位置之后的执行,应该是到D呀,为什么F就到E了呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-3 20:32:06 | 显示全部楼层
straightup 发表于 2020-6-3 20:22
楼主你好 ,我想问下class F中是 super(G,self).__init__(),那 按__mro__() 列表中G的位置之后的执行 ...

仔细看看程序
super(G,self).__init__()被注释掉了呢~
执行的是super().__init__()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-3 21:52:36 | 显示全部楼层
sunrise085 发表于 2020-6-3 20:32
仔细看看程序
super(G,self).__init__()被注释掉了呢~
执行的是super().__init__()

啊这,太粗心了。那就没问题了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-6 11:04:50 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-11 15:02:22 | 显示全部楼层
E>>G>>D这里没看懂。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-11 22:53:08 | 显示全部楼层
前面按顺序走好好的,最后那题参数看不懂了。。。为什么从B开始是先到C再回B呢?按照MRO跳过D往下走到B(此时为什么不执行"进入B...",F一开始执行也“进入F...”了呀....),B指向C,C指向D还能往回跑的吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-11 23:42:21 | 显示全部楼层
mozhihui 发表于 2020-7-11 22:53
前面按顺序走好好的,最后那题参数看不懂了。。。为什么从B开始是先到C再回B呢?按照MRO跳过D往下走到B(此 ...
(此时为什么不执行"进入B...",F一开始执行也“进入F...”了呀....)

那是因为执行了   d=F()   调用了F类的__init__()

请看绿色的那一行字。
其实,它是从 __mro__() 列表中B的位置之后开始执行,正如最开始在 class F 中有 super() 时,是从 __mro__() 列表中F之后开始执行是一样的道理。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-12 10:24:34 | 显示全部楼层
sunrise085 发表于 2020-7-11 23:42
那是因为执行了   d=F()   调用了F类的__init__()

请看绿色的那一行字。

整理了一下思路:
1、d=F()执行F      >>>   打印“   进入F...   ”
2、从F之后执行E   >>>   打印“   进入E...   ”
3、遇到super(B,self),即从B之后执行C     >>>   打印“   进入C...   ”
4、遇到super(D,self),即从D之后执行B     >>>   打印“   进入B...   ”
5、遇到super(C,self),即从C之后执行A      >>>   打印“   进入A...   ”
#如果把这里变成B,会进入死循环...也就是说加了参数就不符合每个类只调用一次的特性?
#所以参数不当的话就又回到重复调用和死循环的问题了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-12 13:09:10 | 显示全部楼层
mozhihui 发表于 2020-7-12 10:24
整理了一下思路:
1、d=F()执行F      >>>   打印“   进入F...   ”
2、从F之后执行E   >>>   打印“  ...

是的。你的理解是对的。
可以尝试一下,看看结果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-7-21 20:54:48 | 显示全部楼层
本帖最后由 hhheshenme 于 2020-7-21 21:09 编辑

66
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-13 11:40:37 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-17 11:42:46 | 显示全部楼层
学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 18:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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