Python 类与面向对象

把 Python 类系统中的属性查找、方法绑定、继承、MRO、特殊方法与鸭子类型串成一条完整理解链的总览页。

#type / synthesis #status / growing #resource / python #tech / lang / python

[!info] related notes

Python 类与面向对象

Python 的 class 语法只是表层。真正决定这套系统如何工作的,是属性查找、方法绑定、继承链、MRO 和特殊方法协议这些更底层的规则。

范围

这篇总览页不追求把每个机制的细节都塞在一起,而是回答一个更重要的问题:

为什么“类、继承、MRO、特殊方法、鸭子类型”必须放在一起理解?

为什么要放在一起理解

因为 Python 的面向对象不是一套孤立语法糖,而是一条连续机制链:

  1. class 先定义名字和行为放在哪里
  2. 属性查找决定实例访问时到底拿到哪一个值
  3. 方法绑定决定同一个函数为什么会表现成实例方法、类方法或静态方法
  4. 继承和重写决定行为如何复用和扩展
  5. 多重继承与 MRO 决定冲突时的查找顺序
  6. 特殊方法把对象接入运算符、迭代、上下文管理等语言协议
  7. 鸭子类型则说明 Python 调用方更关心“你会不会做”,而不是“你名义上属于谁”

如果只记 class 语法,却不理解后面几层,你会经常在 super()、多重继承、方法类型、可变类属性这些地方踩坑。

依赖路径 / 调用链 / 演进链

1. 先从“对象状态放在哪里”入手

  • python类属性与实例属性 解释类对象和实例对象各自持有什么
  • 这一步决定了“读属性”和“写属性”为什么表现不同

2. 再理解“函数为什么会自动带上 self 或 cls”

3. 然后再进入“继承如何扩展已有行为”

4. 最后处理“多父类时到底谁先执行”

  • Python 多重继承与 MRO 把这条链补完整
  • 一旦进入多重继承,super()、属性查找和方法重写都会统一受 MRO 约束

5. 把对象接回 Python 语言级协议

  • python特殊方法 说明对象为什么能参与 len()+forwith
  • 这一步会把“类系统”和“语言语法”真正接起来

6. 用鸭子类型收束 Python 的整体风格

  • 鸭子类型 提醒你:Python 更重视对象有没有行为能力,而不是有没有名义接口
  • 所以 Python 的 OOP 很少追求死板的“必须先声明接口再实现”

对比与易混淆点

主题容易混淆的说法更准确的理解
类属性 vs 实例属性“实例读到了类属性,所以那就是实例自己的属性”实例只是沿查找链回退到类对象上取值
实例方法 / 类方法 / 静态方法“只是装饰器写法不同”本质差别是调用时自动绑定了什么上下文
super()“就是调用直接父类方法”更准确地说,是沿当前 MRO 调下一个实现
多重继承“会自动很乱,所以不能用”Python 用 MRO 让它可预测,但仍应克制地用于 mixin 风格能力叠加
鸭子类型 vs 继承“既然有鸭子类型,就不需要类和继承”鸭子类型强调调用方按能力消费,类和继承则负责组织实现与复用

推荐阅读顺序

  1. python类属性与实例属性
  2. python实例方法类方法与静态方法
  3. python继承方法重写与super
  4. Python 多重继承与 MRO
  5. python特殊方法
  6. 鸭子类型
创建于 2026/3/24 更新于 2026/5/27