news 2026/6/13 14:53:52

类变量和实例变量的区别是什么?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
类变量和实例变量的区别是什么?

类变量和实例变量的核心区别

类变量和实例变量是 Python 面向对象编程中两种不同作用域的属性,核心差异体现在归属、作用域、内存存储、访问 / 修改方式等方面,具体如下:

一、核心区别对比

对比维度类变量(Class Variable)实例变量(Instance Variable)
归属 / 所有者属于类本身,与实例无关属于每个独立的实例,每个实例拥有专属副本
定义位置类体中、所有实例方法之外(通常在类顶部)通常在__init__方法中(或其他实例方法中),以self.变量名定义
内存存储仅在类的命名空间中存储一份,内存中唯一每个实例在自身__dict__(实例命名空间)中存储一份,多实例多份副本
作用域 / 共享性该类的所有实例共享,一个修改(正确方式)会影响所有实例仅作用于当前实例,不同实例的同名实例变量互不干扰
访问方式类名。类变量 / 实例。类变量(优先查实例,再查类)仅能通过实例.实例变量访问(类名无法直接访问)
修改方式推荐用类名.类变量修改;通过实例需type(实例)/实例.__class__(避免创建实例变量)直接通过实例.实例变量 = 新值修改,仅影响当前实例
生命周期类的加载而创建,随类的销毁而消失(程序结束或类被删除)实例的创建而创建,随实例被垃圾回收而销毁

二、具体详解与示例

1. 定义方式不同

类变量:类体中独立定义(无self

python

运行

class Student: # 类变量:属于 Student 类,所有学生共享 class_name = "高一(1)班" # 类体中、方法外定义 student_count = 0 # 类变量:统计学生总数 def __init__(self, name, age): # 实例变量:属于每个学生实例,用 self. 定义 self.name = name # 每个学生有专属姓名 self.age = age # 每个学生有专属年龄 # 修改类变量(统计实例数量) Student.student_count += 1
实例变量:__init__中用self定义

上述代码中,nameage是实例变量,每个Student实例都会独立拥有这两个属性,互不影响。

2. 归属与共享性不同

类变量:所有实例共享

类变量存储在类的命名空间中,仅一份副本,所有实例访问的都是同一个值:

python

运行

# 创建两个学生实例 stu1 = Student("张三", 16) stu2 = Student("李四", 17) # 所有实例共享类变量 print(stu1.class_name) # 输出:高一(1)班 print(stu2.class_name) # 输出:高一(1)班 print(Student.class_name) # 输出:高一(1)班 # 类变量被修改后,所有实例都受影响 Student.class_name = "高一(2)班" print(stu1.class_name) # 输出:高一(2)班 print(stu2.class_name) # 输出:高一(2)班 # 类变量统计实例数量(共享性体现) print(Student.student_count) # 输出:2(两个实例创建后,类变量累加为2)
实例变量:每个实例独立拥有

不同实例的实例变量相互独立,修改一个实例的实例变量不会影响其他实例:

python

运行

# 修改 stu1 的实例变量 stu1.name = "张三三" stu1.age = 18 # stu2 的实例变量不受影响 print(stu1.name, stu1.age) # 输出:张三三 18 print(stu2.name, stu2.age) # 输出:李四 17

3. 访问与修改方式不同

类变量的访问与修改
  • 访问:支持类名.类变量(推荐)或实例.类变量
  • 修改:必须通过类名(或type(实例)/实例.__class__)修改,否则通过实例.类变量 = 新值会创建同名实例变量,屏蔽类变量。

python

运行

# 错误修改方式:创建实例变量,不影响类变量 stu1.class_name = "高一(3)班" print(stu1.class_name) # 输出:高一(3)班(访问实例变量) print(stu2.class_name) # 输出:高一(2)班(仍访问类变量) print(Student.class_name) # 输出:高一(2)班(类变量未变) # 正确修改方式:通过类名或实例获取类后修改 Student.class_name = "高一(4)班" # 推荐 # 或 type(stu1).class_name = "高一(4)班" # 或 stu1.__class__.class_name = "高一(4)班" print(stu1.class_name) # 输出:高一(4)班(实例无同名变量,访问类变量) print(stu2.class_name) # 输出:高一(4)班
实例变量的访问与修改
  • 访问:仅支持实例.实例变量,类名无法直接访问(类没有实例变量的引用);
  • 修改:直接实例.实例变量 = 新值即可,仅影响当前实例。

python

运行

# 正确访问实例变量 print(stu1.name) # 输出:张三三 # 错误:类名无法访问实例变量 # print(Student.name) # 报错:AttributeError: type object 'Student' has no attribute 'name' # 修改实例变量 stu2.age = 19 print(stu2.age) # 输出:19 print(stu1.age) # 输出:18(不受影响)

4. 内存存储与生命周期不同

  • 类变量:程序运行时,类被加载到内存时创建,存储在类的命名空间中,仅一份;直到程序结束或类被显式删除,类变量才会被销毁。
  • 实例变量:当创建实例(类名())时,在实例的__dict__中创建,每个实例对应一份独立存储;当实例不再被引用(如赋值为None),被垃圾回收机制回收时,实例变量随之销毁。

python

运行

# 查看类的命名空间(包含类变量) print(Student.__dict__) # 可看到 class_name、student_count 等类变量 # 查看实例的命名空间(包含实例变量,无同名类变量) print(stu1.__dict__) # 输出:{'name': '张三三', 'age': 18}(无 class_name)

三、总结

  1. 类变量归属于,仅一份副本,所有实例共享;实例变量归属于单个实例,多实例多份副本,互不干扰。
  2. 类变量定义在类体方法外,实例变量通常在__init__中用self定义。
  3. 类变量推荐用类名.类变量访问 / 修改;实例变量仅能通过实例.实例变量操作。
  4. 类变量生命周期随类,实例变量生命周期随实例;内存中类变量仅存储一份,实例变量每个实例各存一份。

https://avg.163.com/topic/detail/8254755
https://avg.163.com/topic/detail/8254763
https://avg.163.com/topic/detail/8254780
https://avg.163.com/topic/detail/8254753
https://avg.163.com/topic/detail/8254756
https://avg.163.com/topic/detail/8254760
https://avg.163.com/topic/detail/8254765
https://avg.163.com/topic/detail/8254775
https://avg.163.com/topic/detail/8254782
https://avg.163.com/topic/detail/8254754
https://avg.163.com/topic/detail/8254795
https://avg.163.com/topic/detail/8254789
https://avg.163.com/topic/detail/8254794
https://avg.163.com/topic/detail/8254761
https://avg.163.com/topic/detail/8254752
https://avg.163.com/topic/detail/8254805
https://avg.163.com/topic/detail/8254779
https://avg.163.com/topic/detail/8254767
https://avg.163.com/topic/detail/8254808
https://avg.163.com/topic/detail/8254801
https://avg.163.com/topic/detail/8254792
https://avg.163.com/topic/detail/8254778
https://avg.163.com/topic/detail/8254802
https://avg.163.com/topic/detail/8254751
https://avg.163.com/topic/detail/8254750
https://avg.163.com/topic/detail/8254749
https://avg.163.com/topic/detail/8254764
https://avg.163.com/topic/detail/8254790
https://avg.163.com/topic/detail/8254766
https://avg.163.com/topic/detail/8254762
https://avg.163.com/topic/detail/8254776
https://avg.163.com/topic/detail/8254777
https://avg.163.com/topic/detail/8254791
https://avg.163.com/topic/detail/8254793
https://avg.163.com/topic/detail/8254809
https://avg.163.com/topic/detail/8254804
https://avg.163.com/topic/detail/8254757
https://avg.163.com/topic/detail/8254774
https://avg.163.com/topic/detail/8254768
https://avg.163.com/topic/detail/8254787
https://avg.163.com/topic/detail/8254781
https://avg.163.com/topic/detail/8254806
https://avg.163.com/topic/detail/8254759
https://avg.163.com/topic/detail/8254796
https://avg.163.com/topic/detail/8254773
https://avg.163.com/topic/detail/8254807
https://avg.163.com/topic/detail/8254788
https://avg.163.com/topic/detail/8254803

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

Python管理S5735S-S24T4S-XA

文章目录 一、核心前提:交换机基础配置(必须先完成) 二、Python核心库选型 库安装命令 三、Python实操案例(覆盖VLAN管理核心场景) 案例1:SSH连接交换机,查询VLAN配置(故障排查基础) 案例2:通过SSH配置VLAN(创建/删除/修改) 案例3:配置Trunk端口与Access端口(VLA…

作者头像 李华
网站建设 2026/6/10 16:55:13

LangFlow作业批改辅助系统设计思路

LangFlow作业批改辅助系统设计思路 在智能教育工具不断演进的今天,一个现实问题正困扰着一线教师:如何在不牺牲教学质量的前提下,高效处理海量学生作业?尤其面对开放性问答题时,人工批改耗时费力,而传统自动…

作者头像 李华
网站建设 2026/6/10 15:41:33

【AI工程化新里程碑】:Open-AutoGLM 沉思版如何实现90%任务全自动闭环?

第一章:AI工程化新里程碑的背景与意义人工智能技术在过去十年中取得了突破性进展,从学术研究逐步走向工业级应用。这一转变催生了“AI工程化”的概念,即将AI模型开发、部署、监控和迭代过程系统化、标准化,以支撑大规模生产环境下…

作者头像 李华
网站建设 2026/6/10 15:44:07

企业环境下的部署挑战:批量安装Multisim于Win10与Win11策略对比

企业级EDA工具部署实战:如何高效批量安装Multisim于Win10与Win11共存环境在一家中型电子研发企业的IT运维中心,系统管理员李工正面临一个棘手问题:公司新采购的50台高性能工作站已全面预装Windows 11,而原有的200多台工程师终端仍…

作者头像 李华
网站建设 2026/6/13 12:09:57

EaseUS Fixo(易我视频照片修复)

EaseUS Fixo 是 Windows 上一款视频照片文件修复软件。修复任何损坏或无法播放的视频,包括 MOV、MP4、M2TS、MKV、MTS、3GP,无论它如何损坏,都更容易。从任何设备修复损坏的照片,可以智能地修复计算机或其他外部存储设备&#xff…

作者头像 李华
网站建设 2026/6/10 18:34:27

ARM平台交叉编译实战案例(基于Yocto项目)

在ARM上构建未来:用Yocto打造工业级嵌入式系统的实战心法你有没有遇到过这样的场景?团队里三个人编译同一个程序,结果一个能跑,两个报错“符号未定义”;换台机器重装环境后,原本好好的镜像突然启动失败&…

作者头像 李华