You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 23:54:05