掌握类与对象高级特性关键在于理解“类怎么用、对象怎么活”,围绕封装数据、复用逻辑、表达关系三大动作,从封装、继承、实例与类变量区分、self作用四个维度展开。

掌握类与对象的高级特性,关键不在背概念,而在理解“类怎么用、对象怎么活”。它不是堆砌语法,而是围绕三个核心动作展开:封装数据、复用逻辑、表达关系。下面从四个实用维度讲清楚。
封装:让属性和方法真正属于对象本身
封装不是加双下划线就完事。重点是区分“谁该访问什么”:
- 实例属性(self.name)必须在 __init__ 或其他方法里用 self. 显式绑定,每个对象独有一份
- 类属性(写在类体里、方法外,如 count = 0)是所有实例共享的,适合记录全局状态(比如创建了多少个对象)
- 私有属性(__name)靠命名约定限制直接访问,但真正起作用的是配套的 getter/setter 方法——在 setter 里加校验逻辑,比单纯赋值更可靠
继承:不是抄代码,而是建关系
继承的本质是“是一种”的语义关系,不是为了少写几行。实际用时注意:
- 子类构造函数里,如果父类有 __init__,必须显式调用 super().__init__(...),否则父类的初始化逻辑不会执行
- 多继承时,Python 按 MRO(方法解析顺序)查找方法,可用 ClassName.__mro__ 查看;日常开发优先用单继承,避免歧义
- 重写父类方法时,不是覆盖就结束,常需在子类方法中用 super().method_name() 补上父类原有逻辑
实例与类的变量区分要落地到行为
很多人混淆类变量和实例变量,根本原因是没观察它们的行为差异:
- 把列表、字典等可变对象设为类属性,会导致所有实例共用同一份内存——一个实例改了,别的全跟着变。这是常见 bug 来源
- 正确做法:可变数据一律放在 __init__ 里用 self.xxx = [] 初始化,确保每个实例独立
- 类属性适合放不可变的、跨实例一致的值,比如配置项、默认标志、计数器
self 不是关键字,而是约定俗成的“当前对象代言人”
self 是 Python 传递实例对象的机制体现,不是语法强制名(你写 this 也能跑),但必须存在且是第一个参数:
- 定义方法时漏掉 self,调用会报错:缺少必需的位置参数
- 调用时不用传 self,Python 自动把点号左边的对象塞进去(obj.method() 等价于 Class.method(obj))
- 理解 self,就理解了“为什么每个对象能记住自己的数据”——因为所有属性都绑在它身上










