Python中super()返回对象的属性疑问:为何dir()无f但s.f可正常访问?
原因解释
这个现象是super()返回对象的特殊实现机制,和dir()函数的工作规则共同导致的:
- 首先你调用
super()得到的s不是父类A的实例,而是Python内置的super代理对象,这个对象本身只存储了查找父类属性需要的上下文(比如当前实例b、当前类B),本身没有继承A的任何属性和方法,你用dir(s)看到的所有输出就是这个代理对象自身全部的属性。 dir()函数的默认逻辑是返回目标对象自身定义的属性、以及对象所属类的方法解析顺序(MRO)链上所有类定义的属性,不会触发super代理的特殊属性查找逻辑,所以自然不会列出父类A的f方法。- 当你直接访问
s.f时,会触发super代理的__getattribute__特殊方法,这个方法会跳过当前类B,从B的父类MRO链中查找f属性,因此可以正常找到A类定义的f方法并绑定到实例b上,不会抛出AttributeError。
你可以通过以下方式验证这个逻辑:
运行print('f' in dir(s.__self__))会输出True,因为s.__self__就是你创建的B类实例b,和第一个示例里的b是同一个对象。
内容的提问来源于stack exchange,提问作者ori6151
相关产品推荐
相关产品推荐

