
类变量 实例变量 作用域完整区分一、先理清两个核心概念作用域 能访问到该变量的代码范围两者载体不同类变量挂载在类上实例变量挂载在单个实例 self上二、实例变量self.xxx作用域1. 可访问范围当前实例内部所有方法实例方法、类方法不行、静态方法无 selfpython运行class A: def __init__(self): self.name 张三 # 实例变量 def test(self): print(self.name) # ✅ 实例方法内可访问外部代码通过实例对象访问python运行a A() print(a.name) # ✅ 外部通过实例读取2. 不可访问范围类方法classmethod中只用cls拿不到实例变量静态方法staticmethod无 self、无 cls完全无法访问直接用类名A.name访问报错其他实例不能访问另一个实例的实例变量python运行a1 A() a2 A() print(a1.name) print(a2.name) # a2 不能读取 a1 的 self.name各自独立3. 生命周期绑定作用域实例销毁后实例变量作用域直接消失全局、其他类都拿不到。三、类变量类内直接定义self 外作用域1. 可访问范围类内部任意位置实例方法self.类变量名/类名.类变量名类方法cls.类变量名静态方法类名.类变量名外部代码两种访问方式python运行class A: count 0 # 方式1推荐 print(A.count) # 方式2仅读取赋值会踩坑 a A() print(a.count)子类可继承访问python运行class B(A): pass print(B.count) # 子类能读取父类类变量2. 不可访问范围不存在实例隔离所有实例读取的是同一个类变量只有删除类本身类变量才彻底失效。四、作用域关键区别对照表表格对比项实例变量 self.xxx类变量归属载体单个实例对象类本身所有实例共享实例方法内✅ self.xxx 直接访问✅ self.var/ 类名.var类方法内❌ 无法访问无 self✅ cls.var静态方法内❌ 无法访问✅ 类名.var类名直接访问❌ 报错✅ 推荐访问方式跨实例访问❌ A 实例不能读 B 实例变量✅ 全部实例共用同一份子类继承❌ 不继承实例变量✅ 子类可读取父类类变量外部通过实例赋值正常修改自身变量❌ 不会改类变量新建同名实例变量遮蔽五、补充边界案例1. 实例方法读取类变量没问题但赋值有坑python运行class A: num 10 def func(self): print(self.num) # 读取先找实例无向上找类变量 ✅ self.num 20 # 赋值新增实例变量不再操作类变量2. 类方法只能操作类变量碰不到实例变量python运行class A: num 10 def __init__(self): self.age 18 classmethod def cls_func(cls): print(cls.num) # ✅ print(cls.age) # ❌ 报错类看不到实例变量3. 子类修改类变量不会污染父类作用域python运行class Parent: val 1 class Son(Parent): pass Son.val 99 print(Parent.val) # 1父类作用域不受影响六、一句话总结实例变量作用域只局限于单个实例只有拿到该实例对象才能访问实例之间完全隔离类变量作用域覆盖整个类、所有实例、子类、全局代码只要类存在任何地方都能通过类名读取修改。