在Python中访问类变量和实例变量的方法

 更新时间:2026年05月27日 09:35:23   作者:冰小忆  
这段文章详细解释了在Python中访问类变量和实例变量的规则,包括通过类名实例名访问变量的方式、注意事项及易错点,关键点在于类变量可通过类名实例名访问,而实例变量仅能通过实例名访问,避免遮蔽问题和类内访问错误,需要的朋友可以参考下

在 Python 中访问类变量和实例变量的核心规则是:类变量可通过「类名」或「实例名」访问(类名访问更精准),实例变量仅能通过「实例名」访问。下面分「访问场景」「具体语法」「易错点」三个维度讲透,结合例子让你快速掌握。

一、访问类变量的两种方式

类变量属于类本身,因此有两种合法访问方式,核心区别是「是否依赖实例」。

访问方式语法适用场景优点
通过类名访问类名.类变量名任何场景(推荐优先使用)直接访问类变量本身,无歧义
通过实例名访问实例名.类变量名已有实例,且无需修改类变量时便捷,与实例变量访问语法统一

代码示例:访问类变量

class Student:
    # 定义类变量
    school = "北京大学"
    count = 0
    def __init__(self, name):
        # 定义实例变量
        self.name = name
        Student.count += 1  # 类内部通过类名访问类变量(推荐)
# 1. 类外部通过类名访问(最推荐,无实例也能访问)
print(Student.school)  # 输出:北京大学
print(Student.count)   # 输出:0(还未创建实例)
# 2. 创建实例后,通过实例访问类变量
stu1 = Student("张三")
print(stu1.school)     # 输出:北京大学(实例共享类变量)
print(stu1.count)      # 输出:1(类变量已被__init__修改)
# 3. 类内部的方法中访问类变量
class Student:
    school = "北京大学"
    # 实例方法中访问类变量
    def print_school(self):
        print("实例方法访问:", Student.school)  # 类名访问(推荐)
        # 也可通过self访问(等价于self.__class__.school)
        print("self访问类变量:", self.school)
    # 类方法中访问类变量(推荐用cls)
    @classmethod
    def change_school(cls, new_school):
        cls.school = new_school
        print("类方法访问:", cls.school)  # cls等价于类名
    # 静态方法中访问类变量(只能用类名)
    @staticmethod
    def static_print():
        print("静态方法访问:", Student.school)
stu = Student("李四")
stu.print_school()       # 实例方法访问类变量
Student.change_school("清华大学")  # 类方法访问/修改类变量
Student.static_print()   # 静态方法访问类变量

二、访问实例变量的唯一方式

实例变量属于单个实例,因此只能通过「实例名」访问,类名无法直接访问(实例变量是实例的 “私有属性”)。

访问场景语法注意事项
类外部访问实例名.实例变量名必须先创建实例,否则报错
类内部方法访问self.实例变量名self 代表当前实例,是访问实例变量的唯一入口

代码示例:访问实例变量

class Student:
    def __init__(self, name, score):
        # 定义实例变量
        self.name = name
        self.score = score
    # 类内部访问实例变量(必须用self)
    def print_info(self):
        print(f"姓名:{self.name},分数:{self.score}")
# 1. 类外部访问实例变量(先创建实例)
stu1 = Student("张三", 90)
print(stu1.name)   # 输出:张三
print(stu1.score)  # 输出:90
# 2. 类内部通过self访问实例变量
stu1.print_info()  # 输出:姓名:张三,分数:90
# 3. 错误示例:类名无法访问实例变量
# print(Student.name)  # 报错:AttributeError: type object 'Student' has no attribute 'name'
# 4. 不同实例的实例变量独立访问
stu2 = Student("李四", 85)
print(stu2.name)   # 输出:李四(与stu1的name互不干扰)

三、关键易错点与避坑指南

1. 实例访问类变量时,若实例有同名变量会 “遮蔽” 类变量

实例访问实例名.变量名时,Python 会优先查找实例自身的变量,找不到才会找类变量。若实例有同名变量,会遮蔽类变量(看似 “访问类变量”,实际访问的是实例变量):

class Student:
    school = "北京大学"
stu = Student()
stu.school = "复旦大学"  # 给实例新增同名变量
print(stu.school)       # 输出:复旦大学(访问的是实例变量,而非类变量)
print(Student.school)   # 输出:北京大学(类变量未变)

2. 类内部访问类变量:优先用类名 /cls,而非 self

在实例方法中用self.类变量名访问时,若实例有同名变量,会误访问实例变量。推荐用类名.类变量名(或self.__class__.类变量名):

class Student:
    school = "北京大学"
    def wrong_access(self):
        self.school = "错误值"  # 实际是给实例新增变量
        print(self.school)     # 输出:错误值(误访问实例变量)
    def right_access(self):
        print(Student.school)  # 输出:北京大学(精准访问类变量)
stu = Student()
stu.wrong_access()
stu.right_access()

3. 不能通过类名访问实例变量,哪怕实例已存在

实例变量是实例的属性,类名无法感知具体实例,因此无论是否创建实例,类名都不能访问实例变量:

stu = Student("张三", 90)
# print(Student.name)  # 始终报错:类无此属性

四、访问规则总结表

变量类型合法访问方式非法访问方式核心提醒
类变量1. 类名。类变量名2. 实例名。类变量名无(两种方式都合法)实例访问时注意同名遮蔽问题
实例变量1. 实例名。实例变量名2. 类内 self. 实例变量名类名。实例变量名只能通过实例 /self 访问,类名不行

最终总结

  • 访问类变量:优先用类名.类变量名(精准无歧义),实例仅在 “无同名变量” 时可临时用实例名.类变量名
  • 访问实例变量:唯一合法方式是实例名.实例变量名(类外)或self.实例变量名(类内),类名访问必报错;
  • 核心原则:“谁的属性找谁要”—— 类变量找类,实例变量找实例。

以上就是在Python中访问类变量和实例变量的方法的详细内容,更多关于Python访问类变量和实例变量的资料请关注脚本之家其它相关文章!

相关文章

  • Python Traceback异常代码排错利器使用指南

    Python Traceback异常代码排错利器使用指南

    这篇文章主要为大家介绍了Python Traceback异常代码排错利器使用指南,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • 解决python3 HTMLTestRunner测试报告中文乱码的问题

    解决python3 HTMLTestRunner测试报告中文乱码的问题

    今天小编就为大家分享一篇解决python3 HTMLTestRunner测试报告中文乱码的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • Python Pipeline处理数据工作原理探究

    Python Pipeline处理数据工作原理探究

    如果你是一个Python开发者,你可能听过"pipeline"这个术语,但 pipeline 到底是什么,它又有什么用呢?在这篇文章中,我们将探讨 Python 中的 pipeline 概念,它们是如何工作的,以及它们如何帮助你编写更清晰、更高效的代码
    2024-01-01
  • 使用Python IDLE进行Debug调试的图文步骤

    使用Python IDLE进行Debug调试的图文步骤

    本文主要介绍了使用Python IDLE进行Debug调试的图文步骤,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-02-02
  • LyScript实现指令查询功能的示例代码

    LyScript实现指令查询功能的示例代码

    对LyScript自动化插件进行二次封装,可以实现从内存中读入目标进程解码后的机器码。所以本文为大家介绍了如何实现LyScript指令查询功能,需要的可以参考一下
    2022-09-09
  • Python如何按单元格读取复杂电子表格(Excel)的数据

    Python如何按单元格读取复杂电子表格(Excel)的数据

    这篇文章主要介绍了Python如何按单元格读取复杂电子表格(Excel)的数据问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • Python解决雅努斯问题实例方案详解

    Python解决雅努斯问题实例方案详解

    这篇文章主要介绍了Python解决雅努斯问题实例方案,雅努斯问题是指AI生成的3D对象在不同视角下出现不一致性的问题,即从不同角度看物体时,物体的形状会出现不连贯或不一致的现象,比如一个物体在某个视角下看起来像有两个头或者多个面,需要的朋友可以参考下
    2025-05-05
  • 使用python爬取抖音视频列表信息

    使用python爬取抖音视频列表信息

    这篇文章主要介绍了如何用python爬取抖音视频列表信息,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-07-07
  • 在Python中调用Ping命令,批量IP的方法

    在Python中调用Ping命令,批量IP的方法

    今天小编就为大家分享一篇在Python中调用Ping命令,批量IP的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • python Autopep8实现按PEP8风格自动排版Python代码

    python Autopep8实现按PEP8风格自动排版Python代码

    这篇文章主要介绍了python Autopep8实现按PEP8风格自动排版Python代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03

最新评论