Python 高级编程 019类变量与实例变量彻底解析一、先搞懂什么是类变量什么是实例变量1.1 类变量归属于类的「共享资产」1.2 实例变量归属于对象的「私有资产」二、属性查找规则先实例后类 ⬆️三、最容易踩坑修改行为完全不同3.1 用「类名」修改真正改类变量3.2 用「实例名」赋值不是修改是「新建」四、类变量的本质所有实例「共享」五、一张表总结再也不会忘六、最后小结 ✨在 Python 面向对象编程里类变量与实例变量是最基础、却最容易踩坑的知识点。很多时候代码逻辑异常、数据被意外篡改根源都在于没分清变量到底归属于「类」还是归属于「实例」。今天我们就用最通俗的语言 可直接运行的代码把这两个概念掰开揉碎让你彻底理解它们的定义、查找规则与修改行为。一、先搞懂什么是类变量什么是实例变量1.1 类变量归属于类的「共享资产」类变量直接定义在类内部、方法外部它不属于某一个实例而是整个类的所有实例共享的属性。你可以把它理解为这个类的「公共配置」「全局参数」。classA:# 类变量定义在类内部、方法外AA1def__init__(self,x,y):self.xx self.yy1.2 实例变量归属于对象的「私有资产」实例变量对象变量定义在方法内部并且必须以self.开头绑定到具体实例。它是每个对象独立拥有的属性互不干扰。classA:AA1def__init__(self,x,y):# 实例变量绑定到 self当前实例self.xx self.yy一句话区分直接写在类里 → 类变量带 self. → 实例变量二、属性查找规则先实例后类 ⬆️Python 查找属性有一条铁律从当前实例自身找 → 找不到 → 向上找类的属性 → 还找不到 → 报错而反过来类绝对不会向下查找实例的属性我们用代码验证# 实例化对象aA(2,3)# 访问实例变量自己就有直接返回print(a.x)# 2print(a.y)# 3# 访问类变量实例自己没有向上找到类的 AAprint(a.AA)# 1# ❌ 类不能访问实例变量# print(A.x) → 报错type object A has no attribute x这就是为什么实例能读到类变量但类绝对读不到实例变量因为实例变量是绑定到具体对象的类根本不知道它有哪些实例。三、最容易踩坑修改行为完全不同这是 90% 开发者都会混淆的点用「类名」修改 vs 用「实例名」修改结果天差地别3.1 用「类名」修改真正改类变量classA:AA1def__init__(self,x,y):self.xx self.yy aA(2,3)# ✅ 用类名修改真正修改类变量A.AA11print(a.AA)# 11实例共享到新值print(A.AA)# 11类本身已被修改✅ 结论类变量一改所有实例全部同步更新3.2 用「实例名」赋值不是修改是「新建」classA:AA1def__init__(self,x,y):self.xx self.yy aA(2,3)# ❌ 看起来像修改实际是给实例 a 新建一个实例变量 AAa.AA100print(a.AA)# 100实例自己有了优先用自己的print(A.AA)# 1类变量纹丝不动 核心真相实例。属性 值 → 不会修改类变量而是给这个实例新增一个同名实例变量从此实例a有自己的AA类A依然保留原来的AA两者完全独立互不影响。四、类变量的本质所有实例「共享」再看一个例子你会更通透classA:AA1def__init__(self,x,y):self.xx self.yy# 实例化两个对象aA(2,3)bA(4,5)# 统一修改类变量A.AA11print(a.AA)# 11print(b.AA)# 11print(A.AA)# 11✅ 最终结论类变量是全局共享的一个修改全部生效实例变量是独立私有的各用各的互不干扰。五、一张表总结再也不会忘维度类变量实例变量定义位置类内部、方法外方法内部带self.归属整个类所有实例共享单个实例独立私有查找顺序实例找不到时向上查找优先查找自身修改方式类名。属性 值实例名。属性 值实例赋值不会改类会新建实例属性直接修改自身属性影响范围所有实例同步生效只影响当前实例六、最后小结 ✨在 Python 面向对象的世界里类变量是「公共池」大家共用一改全改实例变量是「私人抽屉」各自独立互不打扰。只要记住两条铁律查找先实例后类赋值实例赋值 新建属性不是修改类变量你就彻底掌握了类变量与实例变量的核心后续再学习属性查找顺序、自省机制都会一通百通。下一篇我们继续深入Python 属性查找的完整链路MRO 与实例 / 类 / 父类优先级带你彻底打通面向对象任督二脉
Python 高级编程 019:类变量与实例变量彻底解析
Python 高级编程 019类变量与实例变量彻底解析一、先搞懂什么是类变量什么是实例变量1.1 类变量归属于类的「共享资产」1.2 实例变量归属于对象的「私有资产」二、属性查找规则先实例后类 ⬆️三、最容易踩坑修改行为完全不同3.1 用「类名」修改真正改类变量3.2 用「实例名」赋值不是修改是「新建」四、类变量的本质所有实例「共享」五、一张表总结再也不会忘六、最后小结 ✨在 Python 面向对象编程里类变量与实例变量是最基础、却最容易踩坑的知识点。很多时候代码逻辑异常、数据被意外篡改根源都在于没分清变量到底归属于「类」还是归属于「实例」。今天我们就用最通俗的语言 可直接运行的代码把这两个概念掰开揉碎让你彻底理解它们的定义、查找规则与修改行为。一、先搞懂什么是类变量什么是实例变量1.1 类变量归属于类的「共享资产」类变量直接定义在类内部、方法外部它不属于某一个实例而是整个类的所有实例共享的属性。你可以把它理解为这个类的「公共配置」「全局参数」。classA:# 类变量定义在类内部、方法外AA1def__init__(self,x,y):self.xx self.yy1.2 实例变量归属于对象的「私有资产」实例变量对象变量定义在方法内部并且必须以self.开头绑定到具体实例。它是每个对象独立拥有的属性互不干扰。classA:AA1def__init__(self,x,y):# 实例变量绑定到 self当前实例self.xx self.yy一句话区分直接写在类里 → 类变量带 self. → 实例变量二、属性查找规则先实例后类 ⬆️Python 查找属性有一条铁律从当前实例自身找 → 找不到 → 向上找类的属性 → 还找不到 → 报错而反过来类绝对不会向下查找实例的属性我们用代码验证# 实例化对象aA(2,3)# 访问实例变量自己就有直接返回print(a.x)# 2print(a.y)# 3# 访问类变量实例自己没有向上找到类的 AAprint(a.AA)# 1# ❌ 类不能访问实例变量# print(A.x) → 报错type object A has no attribute x这就是为什么实例能读到类变量但类绝对读不到实例变量因为实例变量是绑定到具体对象的类根本不知道它有哪些实例。三、最容易踩坑修改行为完全不同这是 90% 开发者都会混淆的点用「类名」修改 vs 用「实例名」修改结果天差地别3.1 用「类名」修改真正改类变量classA:AA1def__init__(self,x,y):self.xx self.yy aA(2,3)# ✅ 用类名修改真正修改类变量A.AA11print(a.AA)# 11实例共享到新值print(A.AA)# 11类本身已被修改✅ 结论类变量一改所有实例全部同步更新3.2 用「实例名」赋值不是修改是「新建」classA:AA1def__init__(self,x,y):self.xx self.yy aA(2,3)# ❌ 看起来像修改实际是给实例 a 新建一个实例变量 AAa.AA100print(a.AA)# 100实例自己有了优先用自己的print(A.AA)# 1类变量纹丝不动 核心真相实例。属性 值 → 不会修改类变量而是给这个实例新增一个同名实例变量从此实例a有自己的AA类A依然保留原来的AA两者完全独立互不影响。四、类变量的本质所有实例「共享」再看一个例子你会更通透classA:AA1def__init__(self,x,y):self.xx self.yy# 实例化两个对象aA(2,3)bA(4,5)# 统一修改类变量A.AA11print(a.AA)# 11print(b.AA)# 11print(A.AA)# 11✅ 最终结论类变量是全局共享的一个修改全部生效实例变量是独立私有的各用各的互不干扰。五、一张表总结再也不会忘维度类变量实例变量定义位置类内部、方法外方法内部带self.归属整个类所有实例共享单个实例独立私有查找顺序实例找不到时向上查找优先查找自身修改方式类名。属性 值实例名。属性 值实例赋值不会改类会新建实例属性直接修改自身属性影响范围所有实例同步生效只影响当前实例六、最后小结 ✨在 Python 面向对象的世界里类变量是「公共池」大家共用一改全改实例变量是「私人抽屉」各自独立互不打扰。只要记住两条铁律查找先实例后类赋值实例赋值 新建属性不是修改类变量你就彻底掌握了类变量与实例变量的核心后续再学习属性查找顺序、自省机制都会一通百通。下一篇我们继续深入Python 属性查找的完整链路MRO 与实例 / 类 / 父类优先级带你彻底打通面向对象任督二脉