在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访问类变量和实例变量的资料请关注脚本之家其它相关文章!
相关文章
解决python3 HTMLTestRunner测试报告中文乱码的问题
今天小编就为大家分享一篇解决python3 HTMLTestRunner测试报告中文乱码的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2018-12-12
Python如何按单元格读取复杂电子表格(Excel)的数据
这篇文章主要介绍了Python如何按单元格读取复杂电子表格(Excel)的数据问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2023-06-06
python Autopep8实现按PEP8风格自动排版Python代码
这篇文章主要介绍了python Autopep8实现按PEP8风格自动排版Python代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2021-03-03


最新评论