鱼C论坛

 找回密码
 立即注册
查看: 2635|回复: 13

[已解决]038课后题 关于多重继承的问题

[复制链接]
发表于 2016-10-6 00:03:28 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 人zai旅途 于 2016-10-6 21:20 编辑

代码1:B(A) C(A)
  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.         A.__init__(self)
  9.         print('离开B..')

  10. class C(A):
  11.     def __init__(self):
  12.         print('进入C..')
  13.         A.__init__(self)
  14.         print('离开C..')

  15. class D(B,C):
  16.     def __init__(self):
  17.         print('进入D..')
  18.         super().__init__()
  19.         print('离开D..')
  20.         
  21. f = D()
复制代码

代码2:B() C()
  1. class A():
  2.     def __init__(self):
  3.         print('进入A..')
  4.         print('离开A..')

  5. class B():
  6.     def __init__(self):
  7.         print('进入B..')
  8.         A.__init__(self)
  9.         print('离开B..')

  10. class C():
  11.     def __init__(self):
  12.         print('进入C..')
  13.         A.__init__(self)
  14.         print('离开C..')

  15. class D(B,C):
  16.     def __init__(self):
  17.         print('进入D..')
  18.         super().__init__()
  19.         print('离开D..')
  20.         
  21. f = D()
复制代码

结果是一样的:


问题:
0、上面两套代码输出结果一样,B和C到底有没有继承A?
1、为什么输出结果没有C?
2、super().__init__() 的运行机制是什么?是自动找B,再找C吗?
      如果B和C都继承了A,super会自动找上A吗?
3、super().__init__(self)会报错,是因为将自行找到B C 当成了变量吗?
super().__init__(self)
TypeError: __init__() takes 1 positional argument but 2 were given

报错里面说是 需要1个变量,却给了2个,A不算变量吗?
最佳答案
2016-10-7 20:47:44
本帖最后由 冬雪雪冬 于 2016-10-7 21:02 编辑

抱歉,这两天没有上网,回复晚了。
0.程序1继承了,程序2没有继承。
因为你在新的class里都重写了init,所以看不出是否继承,所谓继承是把基类的所有方法都继承下了,除非在子类中写了同名的方法。我把两个程序改写了,你看看区别。
  1. class A():
  2.     def __init__(self):
  3.         print('进入A..')
  4.         print('离开A..')
  5.     def getX(self):
  6.         print('X=',1)

  7. class B(A):
  8.     def __init__(self):
  9.         print('进入B..')
  10.         A.__init__(self)
  11.         print('离开B..')

  12. class C(A):
  13.     def __init__(self):
  14.         print('进入C..')
  15.         A.__init__(self)
  16.         print('离开C..')

  17. class D(B,C):
  18.     def __init__(self):
  19.         print('进入D..')
  20.         super().__init__()
  21.         print('离开D..')
  22.         
  23.         

  24. f = D()
  25. f.getX()
复制代码

  1. 进入D..
  2. 进入B..
  3. 进入A..
  4. 离开A..
  5. 离开B..
  6. 离开D..
  7. X= 1
复制代码

  1. class A():
  2.     def __init__(self):
  3.         print('进入A..')
  4.         self.x = 1
  5.         print('离开A..')
  6.     def gexX(self):
  7.         print('X=',1)

  8. class B():
  9.     def __init__(self):
  10.         print('进入B..')
  11.         A.__init__(self)
  12.         print('离开B..')

  13. class C():
  14.     def __init__(self):
  15.         print('进入C..')
  16.         A.__init__(self)
  17.         print('离开C..')

  18. class D(B,C):
  19.     def __init__(self):
  20.         print('进入D..')
  21.         super().__init__()
  22.         print('离开D..')
  23.         
  24. f = D()
  25. f.getX()
复制代码

  1. 进入D..
  2. 进入B..
  3. 进入A..
  4. 离开A..
  5. 离开B..
  6. 离开D..
  7. Traceback (most recent call last):
  8.   File "D:\py\2.py", line 28, in <module>
  9.     f.getX()
  10. AttributeError: 'D' object has no attribute 'getX'
复制代码


后面的问题我也没有搞清楚。
输出.png

点评

把帖子分类改为 问题求助  发表于 2016-10-6 18:05
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-10-6 00:33:09 | 显示全部楼层
  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():
  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.         
  22. f = D()
复制代码


输出结果:
进入D..
进入B..
进入A..
离开A..
离开B..
离开D..
>>>
为什么没有C?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-6 00:35:05 | 显示全部楼层
  1. class A():
  2.     def __init__(self):
  3.         print('进入A..')
  4.         print('离开A..')


  5. class B():
  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.         
  22. f = D()
复制代码


输出结果:
进入D..
进入B..
进入C..
进入A..
离开A..
离开C..
离开B..
离开D..
>>>
B(),B没有继承A,C有继承A,结果ABCD都有
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-6 00:36:03 | 显示全部楼层
我都快糊涂了,求大神指点
@无符号整形 @冬雪雪冬
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-6 00:58:03 | 显示全部楼层
人zai旅途 发表于 2016-10-6 00:35
输出结果:
进入D..
进入B..
  1. class A():
  2.     def __init__(self):
  3.         print('进入A..')
  4.         print('离开A..')


  5. class B():
  6.     def __init__(self):
  7.         print('进入B..')
  8.         super().__init__()
  9.         print('离开B..')
  10.         

  11. class C():
  12.     def __init__(self):
  13.         print('进入C..')
  14.         super().__init__()
  15.         print('离开C..')


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

  21.         
  22. f = D()
复制代码


你试试这个就知道了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-6 01:07:51 | 显示全部楼层
本帖最后由 西殴 于 2016-10-6 01:09 编辑
西殴 发表于 2016-10-6 00:58
你试试这个就知道了


我发现是这样   当B类有继承A类   C类没有继承  D类应该这样写 class D(C,B)这样就可以全部进入了
当B类没有继承A类  C类有继承A类 D类这样写 class dD(B,C)也是可以全部进入

我也是刚刚学的哈   不对之处不要介意
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-6 12:06:21 | 显示全部楼层
西殴 发表于 2016-10-6 01:07
我发现是这样   当B类有继承A类   C类没有继承  D类应该这样写 class D(C,B)这样就可以全部进入了
当B ...

谢谢回复
你的意思是,有继承的放在后面,就能全部都进入?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-6 19:31:39 | 显示全部楼层
人zai旅途 发表于 2016-10-6 12:06
谢谢回复
你的意思是,有继承的放在后面,就能全部都进入?

有继承的放前面感觉会挡住后面没有继承的   我也不知道怎么回事   应该是学的不认真忘记了吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-7 20:47:44 | 显示全部楼层    本楼为最佳答案   
本帖最后由 冬雪雪冬 于 2016-10-7 21:02 编辑

抱歉,这两天没有上网,回复晚了。
0.程序1继承了,程序2没有继承。
因为你在新的class里都重写了init,所以看不出是否继承,所谓继承是把基类的所有方法都继承下了,除非在子类中写了同名的方法。我把两个程序改写了,你看看区别。
  1. class A():
  2.     def __init__(self):
  3.         print('进入A..')
  4.         print('离开A..')
  5.     def getX(self):
  6.         print('X=',1)

  7. class B(A):
  8.     def __init__(self):
  9.         print('进入B..')
  10.         A.__init__(self)
  11.         print('离开B..')

  12. class C(A):
  13.     def __init__(self):
  14.         print('进入C..')
  15.         A.__init__(self)
  16.         print('离开C..')

  17. class D(B,C):
  18.     def __init__(self):
  19.         print('进入D..')
  20.         super().__init__()
  21.         print('离开D..')
  22.         
  23.         

  24. f = D()
  25. f.getX()
复制代码

  1. 进入D..
  2. 进入B..
  3. 进入A..
  4. 离开A..
  5. 离开B..
  6. 离开D..
  7. X= 1
复制代码

  1. class A():
  2.     def __init__(self):
  3.         print('进入A..')
  4.         self.x = 1
  5.         print('离开A..')
  6.     def gexX(self):
  7.         print('X=',1)

  8. class B():
  9.     def __init__(self):
  10.         print('进入B..')
  11.         A.__init__(self)
  12.         print('离开B..')

  13. class C():
  14.     def __init__(self):
  15.         print('进入C..')
  16.         A.__init__(self)
  17.         print('离开C..')

  18. class D(B,C):
  19.     def __init__(self):
  20.         print('进入D..')
  21.         super().__init__()
  22.         print('离开D..')
  23.         
  24. f = D()
  25. f.getX()
复制代码

  1. 进入D..
  2. 进入B..
  3. 进入A..
  4. 离开A..
  5. 离开B..
  6. 离开D..
  7. Traceback (most recent call last):
  8.   File "D:\py\2.py", line 28, in <module>
  9.     f.getX()
  10. AttributeError: 'D' object has no attribute 'getX'
复制代码


后面的问题我也没有搞清楚。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-8 19:47:28 | 显示全部楼层
冬雪雪冬 发表于 2016-10-7 20:47
抱歉,这两天没有上网,回复晚了。
0.程序1继承了,程序2没有继承。
因为你在新的class里都重写了init, ...

先谢谢大神的回复,然后在慢慢研究,有问题会再请教~~~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-8 20:21:04 | 显示全部楼层
冬雪雪冬 发表于 2016-10-7 20:47
抱歉,这两天没有上网,回复晚了。
0.程序1继承了,程序2没有继承。
因为你在新的class里都重写了init, ...

大神,您的意思是不是
我原来的程序里面A.__init__(self)和您的class B(A)、class C(A)混在一起,不好区分是否继承,所以在A里面又定义了一个getX(),如果调用getX(),就说明继承了全部的方法,是真的继承;而您改写后的程序1,B、C都继承了A,结果调用了getX(),而程序2却没有。因为实例化以后的f,无法调用getX()
那么结论是不是可以这样呢:class B(A)、class C(A),加上 A.__init__(self)这个调用无绑定父类(或super().__init__())才算是继承成功呢?

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

使用道具 举报

发表于 2016-10-9 08:12:21 | 显示全部楼层
人zai旅途 发表于 2016-10-8 20:21
大神,您的意思是不是
我原来的程序里面A.__init__(self)和您的class B(A)、class C(A)混在一起,不好区 ...

我倒认为使用supper严格的说不算继承,常说的继承应该是通过class 子类(基类)的方式。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-9 20:22:43 | 显示全部楼层
冬雪雪冬 发表于 2016-10-9 08:12
我倒认为使用supper严格的说不算继承,常说的继承应该是通过class 子类(基类)的方式。

好吧,谢谢大神
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-26 03:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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