news 2026/6/9 20:34:44

Python 高级编程 019:类变量与实例变量彻底解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python 高级编程 019:类变量与实例变量彻底解析

Python 高级编程 019:类变量与实例变量彻底解析

  • 一、先搞懂:什么是类变量?什么是实例变量?
    • 1.1 类变量:归属于类的「共享资产」
    • 1.2 实例变量:归属于对象的「私有资产」
  • 二、属性查找规则:先实例,后类 ⬆️
  • 三、最容易踩坑:修改行为完全不同!
    • 3.1 用「类名」修改:真正改类变量
    • 3.2 用「实例名」赋值:不是修改,是「新建」!
  • 四、类变量的本质:所有实例「共享」
  • 五、一张表总结,再也不会忘
  • 六、最后小结 ✨

在 Python 面向对象编程里,类变量实例变量是最基础、却最容易踩坑的知识点。很多时候代码逻辑异常、数据被意外篡改,根源都在于没分清:变量到底归属于「类」,还是归属于「实例」。

今天我们就用最通俗的语言 + 可直接运行的代码,把这两个概念掰开揉碎,让你彻底理解它们的定义、查找规则与修改行为。


一、先搞懂:什么是类变量?什么是实例变量?

1.1 类变量:归属于类的「共享资产」

类变量,直接定义在类内部、方法外部,它不属于某一个实例,而是整个类的所有实例共享的属性。

你可以把它理解为:这个类的「公共配置」「全局参数」。

classA:# 🔥 类变量:定义在类内部、方法外AA=1def__init__(self,x,y):self.x=x self.y=y

1.2 实例变量:归属于对象的「私有资产」

实例变量(对象变量),定义在方法内部,并且必须以self.开头绑定到具体实例。

它是每个对象独立拥有的属性,互不干扰。

classA:AA=1def__init__(self,x,y):# 🔥 实例变量:绑定到 self(当前实例)self.x=x self.y=y

一句话区分:

  • 直接写在类里 → 类变量

  • 带 self. → 实例变量


二、属性查找规则:先实例,后类 ⬆️

Python 查找属性有一条铁律
从当前实例自身找 → 找不到 → 向上找类的属性 → 还找不到 → 报错!

而反过来:类绝对不会向下查找实例的属性!

我们用代码验证:

# 实例化对象a=A(2,3)# 访问实例变量(自己就有,直接返回)print(a.x)# 2print(a.y)# 3# 访问类变量(实例自己没有,向上找到类的 AA)print(a.AA)# 1# ❌ 类不能访问实例变量!# print(A.x) → 报错:type object 'A' has no attribute 'x'

这就是为什么:

  • 实例能读到类变量

  • 类绝对读不到实例变量
    因为实例变量是绑定到具体对象的,类根本不知道它有哪些实例。


三、最容易踩坑:修改行为完全不同!

这是 90% 开发者都会混淆的点:
用「类名」修改 vs 用「实例名」修改,结果天差地别!

3.1 用「类名」修改:真正改类变量

classA:AA=1def__init__(self,x,y):self.x=x self.y=y a=A(2,3)# ✅ 用类名修改:真正修改类变量A.AA=11print(a.AA)# 11(实例共享到新值)print(A.AA)# 11(类本身已被修改)

✅ 结论:
类变量一改,所有实例全部同步更新!

3.2 用「实例名」赋值:不是修改,是「新建」!

classA:AA=1def__init__(self,x,y):self.x=x self.y=y a=A(2,3)# ❌ 看起来像修改,实际是:给实例 a 新建一个实例变量 AAa.AA=100print(a.AA)# 100(实例自己有了,优先用自己的)print(A.AA)# 1(类变量纹丝不动!)

🔥 核心真相:
实例。属性 = 值 → 不会修改类变量,而是给这个实例新增一个同名实例变量!
从此:

  • 实例a有自己的AA

  • A依然保留原来的AA
    两者完全独立,互不影响。


四、类变量的本质:所有实例「共享」

再看一个例子,你会更通透:

classA:AA=1def__init__(self,x,y):self.x=x self.y=y# 实例化两个对象a=A(2,3)b=A(4,5)# 统一修改类变量A.AA=11print(a.AA)# 11print(b.AA)# 11print(A.AA)# 11

✅ 最终结论:
类变量是全局共享的,一个修改,全部生效;
实例变量是独立私有的,各用各的,互不干扰。


五、一张表总结,再也不会忘

维度类变量实例变量
定义位置类内部、方法外方法内部,带self.
归属整个类,所有实例共享单个实例,独立私有
查找顺序实例找不到时向上查找优先查找自身
修改方式类名。属性 = 值实例名。属性 = 值
实例赋值不会改类,会新建实例属性直接修改自身属性
影响范围所有实例同步生效只影响当前实例

六、最后小结 ✨

在 Python 面向对象的世界里:

  • 类变量是「公共池」,大家共用,一改全改;

  • 实例变量是「私人抽屉」,各自独立,互不打扰。

只要记住两条铁律:

  1. 查找:先实例,后类

  2. 赋值:实例赋值 = 新建属性,不是修改类变量

你就彻底掌握了类变量与实例变量的核心,后续再学习属性查找顺序、自省机制,都会一通百通。

下一篇我们继续深入:Python 属性查找的完整链路(MRO 与实例 / 类 / 父类优先级),带你彻底打通面向对象任督二脉!

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

深入解析MC68HC908AT32 TIMA-4定时器:缓冲PWM与中断配置实战

1. 项目概述:为什么我们需要一个强大的定时器模块?在嵌入式开发的世界里,时间就是一切。无论是让一个LED以精确的1Hz频率闪烁,还是测量超声波传感器回波的高电平宽度,亦或是生成驱动电机的PWM信号,其背后都…

作者头像 李华
网站建设 2026/6/9 20:27:59

5分钟掌握BiliTools:B站视频AI总结与智能下载的终极指南

5分钟掌握BiliTools:B站视频AI总结与智能下载的终极指南 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

作者头像 李华
网站建设 2026/6/9 20:24:52

ansys明明设置了英文显示,有些字却仍显示中文,什么原因?

ansys明明设置了英文显示,有些字却仍显示中文,什么原因? ANSYS 设置为英文后仍部分显示中文,通常是因为各模块(如 Workbench、Mechanical、Fluent)语言独立配置、未安装完整英文语言包、或系统环境变量未正确生效。 - 模块语言独立:即使在 Workbench 中设为英文,Mecha…

作者头像 李华
网站建设 2026/6/9 20:21:30

K30 MCU时钟与ADC设计实战:从规格书到高精度低功耗系统实现

1. 项目概述与核心价值在嵌入式硬件设计的江湖里,有两样东西是工程师的“命门”:一个是给整个系统提供心跳的时钟,另一个是把现实世界信号“翻译”给数字大脑的ADC。时钟不稳,系统轻则跑飞,重则“罢工”;AD…

作者头像 李华
网站建设 2026/6/9 20:19:07

如何快速掌握B站API开发:10个实用技巧与完整实现指南

如何快速掌握B站API开发:10个实用技巧与完整实现指南 【免费下载链接】bilibili-api B站API收集整理及开发,不再维护 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-api 想要在B站生态中开发自己的应用吗?这个开源项目为你提…

作者头像 李华