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__字典,用来存储自身的属性,属性查找遵循固定优先级:
- 当访问实例的某个属性时,优先查找实例自身的
__dict__,如果找到对应键,直接返回对应值; - 如果实例
__dict__里没有该键,就会去**类的__dict__**中查找; - 若类的
__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
相关产品推荐
相关产品推荐

