python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python访问类变量和实例变量

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

作者:冰小忆

这段文章详细解释了在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 访问,类名不行

最终总结

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

您可能感兴趣的文章:
阅读全文