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
相关产品推荐
相关产品推荐

