本人在学习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
添加回答
举报
0/150
提交
取消