PYTHON 对象模型 · 状态实验 01
这份列表,到底是谁的?
两个学生对象看上去各自独立,但如果课程列表写在类的命名空间里,它们会拿到同一个可变列表。亲手给其中一人加课,再看看另一人的状态。
当前写法:courses = [] 位于类体中,两个实例沿属性查找链拿到同一份列表。
对象工作台
先选对象,再添加课程Student.courses 共享列表 #L01
现在还是空列表 []
student_a.courses ─┐ ┌─ student_b.courses
▼ ▼
#L01
实验笔记
实验记录
还没有修改状态。试着给 student_a 添加“Python 基础”。
读取 student_a.courses 时
- 先看
student_a自己的属性字典。 - 没有找到
courses,继续去Student类上找。 - 找到类属性列表,并返回这个列表对象;读取动作不会自动复制它。
真正的坑:执行 student_a.courses.append(...) 修改的是类上那份原列表,因此其他实例也能看到变化。
类属性适合放什么
所有实例都应该一致的常量或配置,例如学校名称、允许的状态集合。
实例属性适合放什么
会因对象而不同的状态,例如姓名、成绩、选课列表,通常在 __init__ 中创建。
避坑动作
需要每个对象独享的可变容器,就写成 self.courses = [],让每次实例化都创建新列表。