行者孙Python

铸器篇-Day70 类属性 vs 实例属性

📖 知识点

1. 实例属性

写在__init__里面,用self.xxx定义

  • 归属:属于单个实例对象

  • 每个对象独立,修改 A 对象的实例属性,不会影响其他对象

2. 类属性

直接写在 class 内部、__init__外面

  • 归属:属于这个类本身,所有对象共享

  • 所有实例都可以读取类属性;如果对象没有同名实例属性,读的时候会去查找类属性

 

class Student:
    # 类属性:所有学员共享
    school = "Python武道学院"

    def __init__(self, name, score):
        # 实例属性:每个学员自己独有
        self.name = name
        self.score = score

stu1 = Student("小明", 88)
stu2 = Student("小红", 92)

# 读取类属性,可以用类名或者对象读取
print(Student.school)
print(stu1.school)
print(stu2.school)

 

输出:

 

Python武道学院
Python武道学院
Python武道学院

 

关键特性

  1. 读取类属性:类名.类属性 / 对象.类属性 都可以

  2. 当实例有和类属性同名的实例属性时,优先读取实例属性

  3. ⚠️ 不要用对象.类属性 = 值的方式修改共享类属性!这样做不是修改类属性,而是给这个对象新建了同名实例属性,会覆盖查找。修改类属性推荐写法:类名.属性 = 新值

示例:同名覆盖演示

 

class Student:
    school = "Python武道学院"
    def __init__(self,name):
        self.name = name

stu1 = Student("小明")
stu1.school = "星光书院" # 给stu1新建实例属性,不改动类属性
print(stu1.school) # 优先读实例属性:星光书院
print(Student.school) # 类属性不变:Python武道学院

 

⚔️ Kata 实战任务

任务需求:

  1. 创建 Student 类

  2. 定义类属性:course = "Python Kata"

  3. __init__定义实例属性:name、score

  4. 实例化 stu1 ("小李", 85),stu2 ("小张",90)

  5. 打印两人的 name、score、course

  6. 使用类名修改类属性 course 为Python铸器篇

  7. 再次打印两人 course,观察变化

参考代码

class Student:
    # 类属性,全体共享
    course = "Python Kata"

    def __init__(self, name, score):
        # 实例属性,对象独有
        self.name = name
        self.score = score


stu1 = Student("小李", 85)
stu2 = Student("小张", 90)

print("==== 修改类属性前 ====")
print(f"{stu1.name}:分数{stu1.score},课程:{stu1.course}")
print(f"{stu2.name}:分数{stu2.score},课程:{stu2.course}")

# 修改类属性,使用类名操作
Student.course = "Python铸器篇"

print("\n==== 修改类属性后 ====")
print(f"{stu1.name}:分数{stu1.score},课程:{stu1.course}")
print(f"{stu2.name}:分数{stu2.score},课程:{stu2.course}")

 

运行输出

 

==== 修改类属性前 ====
小李:分数85,课程:Python Kata
小张:分数90,课程:Python Kata

==== 修改类属性后 ====
小李:分数85,课程:Python铸器篇
小张:分数90,课程:Python铸器篇

 

🧠 思考题

  1. 如果执行stu1.course = "Java练习",会不会改变 stu2.course 的值?为什么?

  2. 什么场景适合使用类属性?什么场景必须用实例属性?

‹ 返回目录
🏠首页 Python 📦资源 👤关于我