📖 知识点
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武道学院
关键特性
读取类属性:
类名.类属性/对象.类属性都可以当实例有和类属性同名的实例属性时,优先读取实例属性
⚠️ 不要用
对象.类属性 = 值的方式修改共享类属性!这样做不是修改类属性,而是给这个对象新建了同名实例属性,会覆盖查找。修改类属性推荐写法:类名.属性 = 新值
示例:同名覆盖演示
class Student:
school = "Python武道学院"
def __init__(self,name):
self.name = name
stu1 = Student("小明")
stu1.school = "星光书院" # 给stu1新建实例属性,不改动类属性
print(stu1.school) # 优先读实例属性:星光书院
print(Student.school) # 类属性不变:Python武道学院
⚔️ Kata 实战任务
任务需求:
创建 Student 类
定义类属性:
course = "Python Kata"__init__定义实例属性:name、score实例化 stu1 ("小李", 85),stu2 ("小张",90)
打印两人的 name、score、course
使用类名修改类属性 course 为
Python铸器篇再次打印两人 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铸器篇
🧠 思考题
如果执行
stu1.course = "Java练习",会不会改变 stu2.course 的值?为什么?什么场景适合使用类属性?什么场景必须用实例属性?