网页
资讯
视频
图片
知道
文库
贴吧
地图
采购
进入贴吧
全吧搜索
吧内搜索
搜贴
搜人
进吧
搜标签
日
一
二
三
四
五
六
签到排名:今日本吧第
个签到,
本吧因你更精彩,明天继续来努力!
本吧签到人数:0
一键签到
成为超级会员,使用一键签到
一键签到
本月漏签
0
次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行
补签
。
连续签到:
天 累计签到:
天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
07月31日
漏签
0
天
开课吧python吧
关注:
364
贴子:
4,064
看贴
图片
吧主推荐
游戏
1
2
下一页
尾页
20
回复贴,共
2
页
,跳到
页
确定
<<返回开课吧python吧
>0< 加载中...
【开课吧python】Python的Super方法
只看楼主
收藏
回复
语子易
知名人士
10
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
我们最常见的,可以说几乎唯一能见到的使用super的形式是:
语子易
知名人士
10
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
其中,最常见的method()是init()
以前做过Java,刚刚接触Python的继承,的确感觉有点奇怪,有时候还能搞混。。。当然这还是因为Java是单继承,只能用接口实现类似多继承的方式,而Python就直接支持多继承。
2025-07-31 21:19:25
广告
不感兴趣
开通SVIP免广告
语子易
知名人士
10
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
当我第一次见到这个super()的时候,我想说,这是啥啊?为什么Python的super看起来这么奇怪呢?
super直接指向父类的实例不就得了么?为什么非得搞两个参数?
语子易
知名人士
10
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
而且第一个参数还是自己的类名,而不是父类的类名!
既然是自己的类名你还费劲写一遍干嘛,干脆省略不得了?
第二个参数为啥是self?既然是self你省略不得了?
语子易
知名人士
10
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
还有,super()返回的是个啥玩意啊,为什么可以.method() ? 难道他返回了一个BaseClass的instance么?
今天就来解答这一连串的问题。
语子易
知名人士
10
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
1)super直接指向父类的实例不就得了么?
首先是不能指向,因为子类实例里面根本就没有一个父类实例,这跟java是不同的。
语子易
知名人士
10
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
其次是即便像我们想象的,子类实例里有一个叫super的指针,指向父类的实例(这个父类实例在子类实例生成的时候自动生成了,是子类实例的一个‘成员’)。
但是由于多继承的存在,还是会有问题。这也是跟java不同,java不支持多继承,java用接口的方式实现多继承。
语子易
知名人士
10
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
举个例子:
当只存在单继承的时候,一切很美好,就像java一样:
你只需要在重写方法的时候,用super去调用父类的方法,然后再做自己的事就可以了。
2025-07-31 21:13:25
广告
不感兴趣
开通SVIP免广告
语子易
知名人士
10
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
但是在多继承的情况下,一切都不美好了:
当艺人展示自己能力的时候,他说,父亲啊,你先展示自己的能力,然后我来!
但是父亲是谁? 他有两个父亲! 总不能写两遍 super.展示自己 吧?
那么我们自然想到,给super搞一个参数不得了,指出super的是哪个父类。
语子易
知名人士
10
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
比如 super(歌手).展示自己(),super(演员).展示自己(),好像一切又可以美好了:
先不说这种写法多么的丑陋,重复了那么多无意义的、类似的行,单说这种方法根本就行不通。
我们看看如果某个艺人的实例调用了.展示能力() ,将会输出什么:
语子易
知名人士
10
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
有必要告诉大家两遍你是个人类么?这要是一个又身兼了主持人的艺人,岂不是得大声宣布三次自己是个人类??
这显然是不好的。
而且,这只是其一,假设多说了几遍自己是人类你也能忍,那么还有一种情况,更糟。
语子易
知名人士
10
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
你比如说,艺人类没有重写 展现自己() 这个方法,当你用艺人的实例去调用 展现自己()的时候,将会发生啥?
不重写的方法自动调用父类的,但是有两个父类呀!调用哪个的呢?任意调用一个(比如按从左到右的顺序)?
语子易
知名人士
10
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
那么体现不出他另一个父类的特点呀!比如调用歌手类的,那只能体现出这个艺人既是个歌手,又是个人类,根本体现不出他是个演员!
两个都调用?那万一其中一个父类没有这个方法呢?而且先调用哪个后调用哪个?按照左右顺序么?
总之这样很乱,编译器表示压力很大。
所以,python的super()用了两个参数。
语子易
知名人士
10
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
先写在这里:
super(SubClass, self).method() 的意思是,根据self去找SubClass的‘父亲’,然后调用这个‘父亲’的method()
最最重点的地方来了:对于一个类来说,它的‘父类’到底是谁,取决于站在谁的角度去看。
2025-07-31 21:07:25
广告
不感兴趣
开通SVIP免广告
语子易
知名人士
10
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
‘父亲’之所以加了引号,是因为‘父亲’并不一定是上下级的继承关系,很可能只是兄弟。比如上图中歌手的‘父亲’是‘演员’,但实际上他们是兄弟关系。
所以以后用‘下一个类’来代替这个带引号的‘父亲’。
总之,站在不同的实例的角度,看到的‘下一个类’是不同的。
登录百度账号
扫二维码下载贴吧客户端
下载贴吧APP
看高清直播、视频!
贴吧页面意见反馈
违规贴吧举报反馈通道
贴吧违规信息处理公示