鱼C论坛

 找回密码
 立即注册
查看: 3591|回复: 11

pythond中__init__的理解

[复制链接]
发表于 2016-10-20 14:30:39 | 显示全部楼层 |阅读模式
30鱼币
  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…")
复制代码

请问输入 d=D()后
为什么出现的顺序是:
进入D…
进入B…
进入C…
进入A…
离开A…
离开C…
离开B…
离开D…
在D中调用B和C后为我感觉应该B类执行完再执行C啊。。。。。所以应该是
进入D…
进入B…
进入A…
离开A…
离开B…
进入C…
进入A…
离开A…
离开C...
离开D...
吗?
还有
构造函数__init__怎么去理解?是每一个类中的新方法吗?小甲鱼说:“”实例化方法时,传入参数方法自动调用“”我咋没明白?那这个题目举例子,很多方法中都有 __init__,我怎么判断它自动调用的时那个方法?只是在当前类中调用方法吗?

最佳答案

查看完整内容

__init__()方法是个用来初始化的方法,从基类继承而来(object类定义了__init__()方法)。__init__()方法在类对象被实例化的时候自动调用,完成一些初始化的工作。 __init__()方法也可以被显式的重写
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-10-20 14:30:40 | 显示全部楼层
__init__()方法是个用来初始化的方法,从基类继承而来(object类定义了__init__()方法)。__init__()方法在类对象被实例化的时候自动调用,完成一些初始化的工作。
__init__()方法也可以被显式的重写
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-10-20 14:31:28 | 显示全部楼层
python。。。打错了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-10-20 14:46:02 | 显示全部楼层
好吧,我理解了。。。。只要解释一下怎么让我理解__init__就可以了!!!!!!!!!!!!!谢谢!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!{:10_279:}{:10_279:}{:10_279:}{:10_279:}{:10_279:}{:10_279:}{:10_279:}{:10_279:}{:10_279:}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-10-20 22:46:44 | 显示全部楼层
看不懂诶
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-10-21 01:02:18 | 显示全部楼层
楼主提到的:进入D-》进入B-》进入C-》进入A...这个顺序,与super()的作用,以及mro有关。
mro给出了一个类的顺序,这个顺序用于继承类属性时判断继承哪个类的属性。对于楼主的例子,这个顺序是D-》B-》C-》A-》object
super()基于这个顺序决定调用顺序。
在进入B后,super()根据mro选择调用C的__init__()方法,而不是A的__init__()方法。
个人理解请大腿们指正。
关于super()和mro更准确的解释可以参考https://laike9m.com/blog/li-jie-python-super,70/
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-10-21 01:02:51 | 显示全部楼层
本帖最后由 洛熙封晨 于 2016-10-21 01:06 编辑

super()绝不等于父类!!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-10-21 09:25:29 | 显示全部楼层
个人感觉super应该是有顺序调用函数,而不是按照父类往上追溯函数方法。

__init__是构造方法吧,就是函数初始化时都会执行的方法。类似于C#窗口初始化的时候的那个初始化构造函数。
也就是说,就算你不写__init__方法,其实你的函数也是执行了父类,也就是object的这一方法,如果你重构了他,那就会执行你的__init__方法

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
gmz0821 + 5 + 5 + 3

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-10-22 22:15:12 | 显示全部楼层
洛熙封晨 发表于 2016-10-20 14:30
__init__()方法是个用来初始化的方法,从基类继承而来(object类定义了__init__()方法)。__init__()方法在 ...


是否类后面的参数就默认为魔法方法的参数?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-10-24 15:16:25 | 显示全部楼层
本帖最后由 洛熙封晨 于 2016-10-24 15:20 编辑
gmz0821 发表于 2016-10-22 22:15
是否类后面的参数就默认为魔法方法的参数?


可以认为实例化类时提供的参数传递给了__init__()方法,用于初始化。(虽然事实上这中间还有一些其他过程,但是我感觉这么理解就可以了~)
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-10-24 18:00:11 | 显示全部楼层
洛熙封晨 发表于 2016-10-24 15:16
可以认为实例化类时提供的参数传递给了__init__()方法,用于初始化。(虽然事实上这中间还有一些其他过 ...

好的,谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-10-25 00:26:51 | 显示全部楼层
洛熙封晨 发表于 2016-10-20 14:30
__init__()方法是个用来初始化的方法,从基类继承而来(object类定义了__init__()方法)。__init__()方法在 ...

感谢解答~
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-7 03:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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