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

Python如何追踪类属性变化?内部机制及相关术语咨询

Python类属性与实例属性的查找机制解析

先重现你调试的代码:

class C:
    i = 1
    
a = C()
b = C()
d = C()

b.i = 3
d.i = 4
print(C.i) # -> 1
print(a.i) # -> 1
print(b.i) # -> 3
print(d.i) # -> 4

d.i = 1
print(d.i) # -> 1

C.i = 5
print(C.i) # -> 5
print(a.i) # -> 5
print(b.i) # -> 3
print(d.i) # -> 1

内部实现逻辑

Python中,类和实例都维护着自己的__dict__字典,用来存储自身的属性,属性查找遵循固定优先级:

  1. 当访问实例的某个属性时,优先查找实例自身的__dict__,如果找到对应键,直接返回对应值;
  2. 如果实例__dict__里没有该键,就会去**类的__dict__**中查找;
  3. 若类的__dict__也没有,会继续按MRO(方法解析顺序)向上遍历父类的__dict__。

对应你的代码场景:

  • 初始状态下,实例a、b、d的__dict__都是空的,所以访问a.i、b.i、d.i时,都会去类C的__dict__中取i=1;
  • 执行b.i=3和d.i=4时,是给实例b、d的__dict__分别添加了键i,值为3和4。此时再访问b.i、d.i,会直接从自身__dict__取值,不再去类里查找;
  • 修改C.i=5时,只是更新了类C的__dict__中的i值。实例a的__dict__里没有i,所以访问a.i会去类里取新的5;而b、d的__dict__已有自己的i,所以不受类属性修改的影响。

相关术语

  • 实例属性:绑定在实例__dict__中的属性,仅属于当前实例,与其他实例及类的同名属性相互独立;
  • 类属性:绑定在类__dict__中的属性,可被所有未定义该同名实例属性的实例共享;
  • __dict__:Python对象(类、实例、模块等)用于存储自身属性的内置字典,是属性查找的核心载体;
  • 属性查找链:Python查找属性时遵循的优先级顺序,从实例自身到类再到父类依次查找。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 01:30:56