为了账号安全,请及时绑定邮箱和手机立即绑定

Python super() 调用父类方法, 但是父类中 self 并不是父类的实例而是子类的实例?

Python super() 调用父类方法, 但是父类中 self 并不是父类的实例而是子类的实例?

慕无忌1623718 2019-02-17 21:09:36
本人在学习Python的过程中发现了这么一个问题, 自己查阅了一点资料但是还是没有理解, 如下: 版本为python3.6 代码如下: class X: def __init__(self): self.x = 10 def f(self): return self.x class Y(X): def __init__(self): self.x = 100 def b(self): return super().f() x = X() y = Y() print(y.b()) # -> 100, 为什么不是 10? 问题描述:本人对于super()其实一直不是特别理解, 网上查了一下资料以后理解为super()会返回MRO列表里面的下一个类, 那么我把Y的MRO打印出来: print('mro', Y.mro()) # mro [<class '__main__.Y'>, <class '__main__.X'>, <class 'object'>] 那么根据MRO列表, 下面的类就是X了, 那么super().f()实际就为X.f(), 那么里面的return self.x应该就是X实例, 可是实际运行结果显示self是子类Y的实例. 既然这里的super().f()调用了父类的方法, 里面的self不应该是指代父类实例么? 这是我难以理解的地方. 表述有点乱, 望有前辈能给予解答, 不胜感激! 问题补充: 写这个问题的时候又想到了一点: 继承的时候常常会有super().__init__()来调用父类的__init__()函数, 调用这个函数的时候里面的self其实也就指代了子类实例? 好像与之前的问题一个意思, 但是不知道怎么理解, 望能有前辈指点一下.
查看完整描述

3 回答

?
慕桂英546537

TA贡献1848条经验 获得超10个赞

super().f()在这里是super(Y, self).f(),self是Y的实例, 即方法调用的是父类的f()方法也就是f(self),但是传入参数self是Y的实例,那么self.x即100

查看完整回答
反对 回复 2019-03-01
  • 3 回答
  • 0 关注
  • 656 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信