为什么Python中super返回的对象与self的id值不一致?
问题原因解答
核心误区澄清
你误解了super的本质:super(D, self) 返回的不是父类C的实例,也不是当前的self对象本身,它是Python内置的代理对象,作用仅为按照类的方法解析顺序(MRO)代理查找父类的方法,本身是独立的新对象。
输出差异的具体逻辑
- 调用
super(D, self).__init__()时,super代理会把找到的__init__方法绑定到你传入的self(也就是你创建的D类实例d)上执行,所以父类C的__init__里打印的id(self),本质就是实例d的id。 - 你第二次打印的是
id(super(D, self)),这里拿到的是临时生成的super代理对象自己的id,和实例d完全是两个不同的对象,id自然不一样。
验证方式
你可以在主逻辑里加一行打印,就能验证上面的结论:
if __name__ == '__main__': d = D() print(id(d)) # 输出会和第一个打印的id完全一致
内容的提问来源于stack exchange,提问作者Kenenbek Arzymatov
相关产品推荐
相关产品推荐

