Python类的__dict__究竟存储了哪些实例属性信息?
- 内容介绍
- 文章标签
- 相关推荐
本文共计930个文字,预计阅读时间需要4分钟。
“它不包含任何属性、方法、描述符或内置元信息,仅记录通过self.xxx=...或直接赋值到实例上的键值对。
-
a = A()后,a.__dict__是空字典{},哪怕类里定义了x = 10 -
a.x = 1才会让a.__dict__变成{'x': 1};此时访问a.x优先查这个字典,遮蔽掉类里的同名A.x -
a.__dict__['y'] = 20是合法的,等价于a.y = 20,但绕过了__setattr__钩子,可能跳过验证逻辑 - 如果类用了
__slots__,实例将没有__dict__属性,尝试访问会抛出AttributeError
类 __dict__ 是 mappingproxy,不能直接写入
它不是普通 dict,而是一个只读映射视图,设计上就禁止 A.__dict__['x'] = 10 这类操作。
本文共计930个文字,预计阅读时间需要4分钟。
“它不包含任何属性、方法、描述符或内置元信息,仅记录通过self.xxx=...或直接赋值到实例上的键值对。
-
a = A()后,a.__dict__是空字典{},哪怕类里定义了x = 10 -
a.x = 1才会让a.__dict__变成{'x': 1};此时访问a.x优先查这个字典,遮蔽掉类里的同名A.x -
a.__dict__['y'] = 20是合法的,等价于a.y = 20,但绕过了__setattr__钩子,可能跳过验证逻辑 - 如果类用了
__slots__,实例将没有__dict__属性,尝试访问会抛出AttributeError
类 __dict__ 是 mappingproxy,不能直接写入
它不是普通 dict,而是一个只读映射视图,设计上就禁止 A.__dict__['x'] = 10 这类操作。

