当前位置: 首页 > news >正文

类变量和实例变量的作用域分别是什么?

类变量 & 实例变量 作用域完整区分

一、先理清两个核心概念

  1. 作用域 = 能访问到该变量的代码范围
  2. 两者载体不同:
    • 类变量挂载在
    • 实例变量挂载在单个实例 self

二、实例变量(self.xxx)作用域

1. 可访问范围

  1. 当前实例内部所有方法(实例方法、类方法不行、静态方法无 self)

    python

    运行

    class A: def __init__(self): self.name = "张三" # 实例变量 def test(self): print(self.name) # ✅ 实例方法内可访问
  2. 外部代码:通过实例对象访问

    python

    运行

    a = A() print(a.name) # ✅ 外部通过实例读取

2. 不可访问范围

  1. 类方法@classmethod中,只用cls拿不到实例变量;
  2. 静态方法@staticmethod无 self、无 cls,完全无法访问;
  3. 直接用类名A.name访问,报错;
  4. 其他实例不能访问另一个实例的实例变量:

    python

    运行

    a1 = A() a2 = A() print(a1.name) print(a2.name) # a2 不能读取 a1 的 self.name,各自独立

3. 生命周期绑定作用域

实例销毁后,实例变量作用域直接消失,全局、其他类都拿不到。

三、类变量(类内直接定义,self 外)作用域

1. 可访问范围

  1. 类内部任意位置
    • 实例方法:self.类变量名/类名.类变量名
    • 类方法:cls.类变量名
    • 静态方法:类名.类变量名
  2. 外部代码两种访问方式

    python

    运行

    class A: count = 0 # 方式1(推荐) print(A.count) # 方式2(仅读取,赋值会踩坑) a = A() print(a.count)
  3. 子类可继承访问

    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,父类作用域不受影响

六、一句话总结

  1. 实例变量作用域只局限于单个实例,只有拿到该实例对象才能访问,实例之间完全隔离;
  2. 类变量作用域覆盖整个类、所有实例、子类、全局代码,只要类存在,任何地方都能通过类名读取修改。
http://www.jsqmd.com/news/1197421/

相关文章:

  • 地产集团项目跟投激励:北京华恒智信考核设计案例
  • 2026年7月遵义比特培训学校推荐,遵义比特培训学校 /比特BT复读学校/BT复读学校,遵义比特培训学校寝室条件怎么样 - 品牌推荐师
  • 基于Multisim的电冰箱保护器电路设计与仿真实践
  • 知识表示的方法(3)——状态空间表示法在路径规划中的应用
  • 芝柏中国官方售后服务中心|最新网点地址及电话权威信息通告(2026年7月最新) - 亨得利官方服务中心
  • 3分钟免费激活Windows和Office:KMS_VL_ALL_AIO智能激活脚本完全指南
  • Reset排查实战:从寄存器分析到系统恢复
  • (2026最新)珠海防水补漏本地人必选的正规靠谱公司推荐-房屋漏水检测维修师傅上门-卫生间/厨房/阳台/房顶/外墙漏水检测精准测漏 - 即刻修防水
  • 【Java 8 新特性】Collectors.toMap() 实战:从基础用法到高级场景与性能考量
  • 【数字IC手撕代码】Verilog小数分频实战:从双模前置到相位抖动优化
  • 向量数据库实战:选型、调优与落地~系列文章02:Embedding 嵌入模型选型指南:OpenAI、BGE、Jina、Cohere 横评
  • Adobe-GenP破解工具:5分钟免费解锁Creative Cloud全家桶
  • Multisim低频信号发生器电路设计与仿真实践指南
  • 雅典中国官方售后服务中心|电话和完整地址权威信息通知(2026年7月更新) - 亨得利官方服务中心
  • 2026年基层岗竞聘主管表达升级指南:AI管理行为识别法——4步把执行经验翻译成管理能力
  • 德阳中型多旋翼视距内驾驶员无人机培训老牌机构推荐哪家 - 品牌推广大师
  • 【Spring】DispatcherServlet核心流程与组件协作全解析
  • 中国限定宝可梦魔方解析:玩法、收藏与购买全攻略
  • GAN SQ1魔方评测:磁力定位与竞速设计的全面解析
  • 背景代理技术解析:从概念到实战部署的自动化软件交付方案
  • Python统计高频元素的实用技巧
  • 格拉苏蒂中国官方售后服务中心|服务电话及详细网点地址权威信息声明(2026年7月更新) - 亨得利钟表维修中心
  • GPT-Live实时视频翻译:流式处理与多语言API部署指南
  • VRRP——Master选举的“心跳”与“禅让”
  • 从Prompt到AI Agent:零基础实战大模型应用开发指南
  • 2026年AI大模型代码能力榜:Claude-Opus登顶,国产模型稳居中上游
  • 2026年7月最新长春浪琴官方售后联系电话与客户服务中心网点地址 - 浪琴服务中心
  • Hermes Agent GUI部署实战:Docker一键启动WebUI
  • (2026最新)玉溪防水补漏本地人必选的正规靠谱公司推荐-房屋漏水检测维修师傅上门-卫生间/厨房/阳台/房顶/外墙漏水检测精准测漏 - 即刻修防水
  • 数字电路:从S-R到D锁存器的演进与实战解析