鱼C论坛

 找回密码
 立即注册
查看: 1436|回复: 8

关于super函数的两个小问题

[复制链接]
发表于 2018-2-25 13:19:07 | 显示全部楼层 |阅读模式

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

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

x
  1. class test_1:
  2.     def __init__(self):
  3.         self.name = '我是test_1'
  4.         print(self.name)

  5. class test_2:
  6.     def __init__(self):
  7.         self.name = '我是test_2'
  8.         print(self.name)

  9. class test_3:
  10.     def __init__(self):
  11.         self.name = '我是test_3'
  12.         print(self.name)

  13. class Main(test_1, test_2, test_3):
  14.     def __init__(self):
  15.         super(test_2, self).__init__()


  16. if __name__ == '__main__':
  17.     main = Main()
  18.     print(type(Main.__mro__))
  19.     print(Main.__mro__)
复制代码


问题1:super是一次只找一个父类方法吗?
问题2:
在main类里面,我用super去找test_2的初始化方法,结果打印的是'我是test_3'
super参数改成         super(test_1, self).__init__(),则打印'我是test_2'
我把super里面的参数去掉,则打印'我是test_1'。
很显然python似乎把每个类标上了“序号”,参考多重继承的陷阱
接着我又把类名依次改成  red green blue,那我  super(red, self).__init__()  结果还是打印'我是test_2',很明显super找错了,它找的不是我想要的那个父类方法,这要怎么解决?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-2-25 15:05:25 | 显示全部楼层

回帖奖励 +1 鱼币

关于super和多重继承的类似问题,不知有多少人问了多少遍!
一遍一遍回答真的很心累,可惜就是有人不愿意先百度或者google一下自己看看

super和父类没有任何实质性关系!!!!
一个类在定义继承其他类的瞬间,python就会为这个类生成一个MRO顺序表
super按照在MRO表中查找到的那一项,并按照其后的对应继承关系来确定调用该“父类”

你的Main继承了(test1, test2, test3),python就会按C3线性算法生成MRO表
[__main__.Main, __main__.test1, __main__.test2, __main__.test3]
而且super的一般用法是寻找被调用对象自己的父类,传入的应该是自己的类名,比如你要调Main的父类
super(Main, self).__init__()
这样super才会根据MRO表找到Main的上一级继承父类,即test1
你传入test1, super找到的就是MRO表中test1的后一项,即test2

最后,python请慎用多重继承,尤其是菱形继承。更多详细的请自行百度
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-25 16:33:29 | 显示全部楼层
首先,我之前已经百度过,找了很久没找到才发帖问,其次您回答的内容我都知道,我问的是为什么super找错了,在一篇文章中我找到了答案:当你使用 super(cls, inst) 时,Python 会在 inst 的 MRO 列表上搜索 cls 的下一个类。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-2 09:56:07 | 显示全部楼层

回帖奖励 +1 鱼币

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

使用道具 举报

发表于 2018-3-2 09:56:38 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-12-20 13:00:34 | 显示全部楼层

回帖奖励 +1 鱼币

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

使用道具 举报

发表于 2018-12-20 17:24:15 | 显示全部楼层
顶一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-22 09:01:15 | 显示全部楼层

回帖奖励 +1 鱼币

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

使用道具 举报

发表于 2018-12-22 09:47:13 | 显示全部楼层

回帖奖励 +1 鱼币

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-10 23:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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