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

Python实例__dict__为何不包含类属性?版本差异疑问

为什么Python实例的__dict__不包含类属性?

这是个很典型的Python属性存储逻辑误解,咱们慢慢理清楚:

首先你定义的i是类属性,它属于MyClass这个类本身,而不是某个具体的实例。当你创建x = MyClass()这个实例时,Python会给x分配一个独立的__dict__字典,但这个字典只负责存储实例自己独有的属性——也就是你后来手动添加的counter。

你可以直接验证类的__dict__里才存着i:

print(MyClass.__dict__)
# 输出会包含 'i': 12345,还有类的文档字符串、方法f等其他属性

当你通过x.i访问这个属性时,Python会按照「实例__dict__ → 类__dict__ → 父类__dict__」的顺序逐层查找,所以你能访问到i,但它并不存在于实例自己的命名空间里。

Python 2和3在这部分有差异吗?

答案是基本没有。不管是Python 2还是3,类属性和实例属性的核心存储逻辑都是一致的:类属性存在类的命名空间,实例属性存在实例专属的命名空间。唯一的小区别是Python 2里的旧式类(不继承object的类)和新式类在属性查找的细节上有一点不同,但你的例子里,Python 3中MyClass默认是新式类,Python 2里如果写成class MyClass(object)也是新式类,这两种情况下的表现完全一致。

为什么dir(x)能显示所有相关内容?

dir()函数的作用不是直接读取__dict__,它会返回对象所有可访问的属性名称列表,包括:

  • 实例自己的属性(来自x.__dict__)
  • 类的属性(来自MyClass.__dict__)
  • 继承自父类的内置属性和方法(比如object类的__str__等)

所以dir(x)会包含'i'、'f'、'counter'这些内容,而vars(x)或者x.__dict__只返回实例自己添加的属性。

内容的提问来源于stack exchange,提问作者Eric Auld

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:24:03