猿问

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

本人在学习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列表里面的下一个类, 那么我把YMRO打印出来:

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其实也就指代了子类实例? 好像与之前的问题一个意思, 但是不知道怎么理解, 望能有前辈指点一下.

慕无忌1623718
浏览 657回答 3
3回答

慕桂英546537

super().f()在这里是super(Y, self).f(),self是Y的实例, 即方法调用的是父类的f()方法也就是f(self),但是传入参数self是Y的实例,那么self.x即100
随时随地看视频慕课网APP

相关分类

Python
我要回答