news 2026/4/16 15:29:19

Python:实例 __dict__ 详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python:实例 __dict__ 详解

在 Python 的对象模型中,实例的属性并不是直接存在于对象内部的字段,而是统一存放在一个名为 __dict__ 的映射结构中。

理解实例 __dict__,本质上是在理解实例属性从何而来、属性如何被创建、查找与销毁以及实例命名空间的生命周期与作用边界。

一、实例 __dict__ 的定义与本质

实例 __dict__ 是一个字典对象,用于存储实例对象的“实例级属性”。

class A: pass a = A()a.x = 10 print(a.__dict__) # {'x': 10}type(a.__dict__) # <class 'dict'>

说明:

• a.__dict__ 是实例命名空间(Instance Namespace)。

• 键是属性名(字符串),值是对应的属性值。

每个实例都有自己独立的 __dict__。因此:

a1 = A()a2 = A() a1.x = 1a2.x = 2 print(a1.__dict__) # {'x': 1}print(a2.__dict__) # {'x': 2}

实例之间不会共享 __dict__。

二、实例属性的创建机制:写入即绑定

实例属性并不需要提前声明。任何对实例属性的赋值操作,都会直接写入实例的 __dict__。

a.y = 20

等价于:

a.__dict__['y'] = 20

这说明,Python 中实例属性是运行期动态绑定的。实例 __dict__ 是属性创建的唯一存储位置(不考虑 __slots__ 时)。

删除属性时同理:

del a.y# 等价于del a.__dict__['y']

三、实例 __dict__ 在属性查找中的位置

当访问 a.attr 时,Python 使用以下固定顺序进行查找(简化版):

1、实例 a.__dict__

2、类 A.__dict__

3、父类的 __dict__(按 MRO 顺序)

4、若仍未找到,触发 __getattr__()

因此,实例 __dict__ 具有非常高的优先级。

示例:

class A: x = 100 # 类属性 a = A()a.x = 10 # 实例属性 print(a.x) # 10print(A.x) # 100

原因是:

a.__dict__ == {'x': 10}

实例属性会遮蔽(shadow)同名类属性。

四、实例 __dict__ 的生命周期

实例 __dict__ 的生命周期与实例对象完全一致。

1、创建时

a = A()

此时:

a.__dict__ == {}

实例创建完成后即拥有一个空的 __dict__。

2、使用期间

随着属性赋值、修改、删除,实例 __dict__ 持续变化:

a.x = 1a.y = 2del a.x

3、销毁时

当实例对象被垃圾回收:

del a

实例 __dict__ 随实例一并销毁,不会留下任何“残余属性”。

因此,实例 __dict__ 不具备跨实例、跨生命周期的持久性。

五、实例 __dict__ 与方法、描述符的关系

1、实例方法不存放在实例 __dict__

class A: def f(self): pass a = A()'a.f' in a.__dict__ # False

说明:

方法定义在类体内,存放于类 __dict__(此处为 A.__dict__)中,通过描述符机制动态绑定。

2、数据描述符优先级高于实例 __dict__

对于数据描述符(比如 property):

class A: @property def x(self): return 42 a = A()a.__dict__['x'] = 100 a.x # 42

说明:

数据描述符优先于实例 __dict__,但非数据描述符优先级要低于实例 __dict__。

六、实例 __dict__ 与 __slots__ 的限制关系

如果类定义了 __slots__:

class A: __slots__ = ('x',) a = A()a.x = 1

此时:

hasattr(a, '__dict__') # False(默认)

说明:

__slots__ 会移除实例 __dict__,实例属性改为使用静态结构存储,从根本上改变了实例命名空间模型。

若要显式保留:

class A: __slots__ = ('x', '__dict__')

七、常见误解与澄清

误解 1:实例属性存放在类中

❌ 错误

✔ 正解:实例属性只存放在实例 __dict__ 中。

误解 2:实例 __dict__ 与类 __dict__ 是同一个

❌ 错误

✔ 正解:它们是完全不同的命名空间。

误解 3:方法属于实例

❌ 错误

✔ 正解:方法属于类,通过描述符机制绑定实例。

误解 4:删除实例不会影响类属性

✔ 正确

实例 __dict__ 的生命周期与类完全无关。

📘 小结

实例 __dict__ 是实例级命名空间,用于存储对象在运行期动态绑定的属性。它以字典形式存在,生命周期与实例一致,在属性查找顺序中通常优先于类 __dict__。实例属性的赋值、修改与删除本质上都是对实例 __dict__ 的操作。方法不存放在实例 __dict__ 中,而是定义在类中并通过描述符机制动态绑定。

理解实例 __dict__ 有助于掌握 Python 的属性模型、命名空间体系与对象生命周期管理。

“点赞有美意,赞赏是鼓励”

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 12:04:44

11、Azure机器学习中的R集成与常用算法介绍

Azure机器学习中的R集成与常用算法介绍 1. R与Azure机器学习的集成 在Azure机器学习中集成R语言可以带来很多令人兴奋的可能性。以下是使用R进行实验的一些关键操作: - 决策树可视化 :若要可视化决策树,可点击“Execute R Script”模块的第二个输出端口,即“R Device”…

作者头像 李华
网站建设 2026/4/15 19:54:49

在vivado2018.3中从零实现按键消抖项目

从零开始在 Vivado 2018.3 中实现按键消抖&#xff1a;一个真正能用的 FPGA 入门项目你有没有遇到过这种情况——明明只按了一下开发板上的按键&#xff0c;结果 LED 却闪了三下&#xff1f;或者串口打印出“按键按下”好几次&#xff1f;别怀疑人生&#xff0c;这锅不是你的代…

作者头像 李华
网站建设 2026/4/16 10:43:40

3、版本控制中的标签、分支、合并与锁定机制详解

版本控制中的标签、分支、合并与锁定机制详解 1. 版本号系统 在软件开发过程中,版本控制至关重要。版本号系统是版本控制的核心之一。每个文件都有对应的修订版本号,例如 Graph.java 、 Trains.java 、 Node.java 等文件,都存在 revision 1 、 revision 2 、 r…

作者头像 李华
网站建设 2026/4/16 0:06:37

基于Python+Django+SpringBoot健康宝系统(源码+LW+调试文档+讲解等)/健康宝小程序/健康宝微信版/健康宝系统/微信小程序系统/健康宝功能/健康宝使用/健康宝查询

博主介绍 &#x1f497;博主介绍&#xff1a;✌全栈领域优质创作者&#xff0c;专注于Java、小程序、Python技术领域和计算机毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅&#x1f447;&#x1f3fb; 2025-2026年最新1000个热门Java毕业设计选题…

作者头像 李华
网站建设 2026/4/15 16:46:08

GPT-SoVITS语音合成在博物馆导览系统中的实践

GPT-SoVITS语音合成在博物馆导览系统中的实践 在一座现代化的博物馆里&#xff0c;一位外国游客驻足于一件青铜器前。他轻触平板上的展品标签&#xff0c;耳边随即传来一段温润沉稳的英文讲解——声音既不像机械朗读&#xff0c;也不似标准播音腔&#xff0c;而更像是一位熟悉文…

作者头像 李华
网站建设 2026/4/10 5:19:20

GPT-SoVITS语音克隆可用于遗体告别语音复现?

GPT-SoVITS语音克隆可用于遗体告别语音复现&#xff1f; 在一场追思仪式上&#xff0c;一段熟悉的声音缓缓响起&#xff1a;“孩子&#xff0c;别难过&#xff0c;爸爸一直都在。”声音的语气、停顿、甚至那一点微不可察的沙哑&#xff0c;都与逝者生前如出一辙。这不是录音回放…

作者头像 李华