面向对象继承实战核心是“用得上、看得懂、改得了”,强调真实场景切入,厘清“是”关系才继承,预留扩展口子,区分覆盖与扩展,慎用多继承并理清mro。

面向对象继承实战教程的核心是“用得上、看得懂、改得了”。不堆概念,直接从真实开发场景切入,重点讲清楚怎么设计父类、子类怎么扩展、遇到同名方法怎么处理、多继承时注意什么。
明确继承关系再动手
先判断两个类之间是不是“属于”关系,不是就别硬套继承。比如“狗是动物”可以继承,“车轮是汽车”就不适合——那是组合关系。实战中常见错误就是把“有”关系当成“是”关系来继承。
- 能继承的:Employee → Person、Dog → Animal、AdminUser → User
- 不适合继承的:Engine → Car、Button → Window、Database → App(这些更适合用属性引用或依赖注入)
父类要留好扩展口子
父类不是越全越好,而是要抽象出共性,同时预留可重写的点。比如定义一个基类Animal,不要写死make_sound()的具体返回值,只留空方法或抛异常,强制子类实现。
- 构造函数里用super().__init__()调用父类初始化,别漏掉共享字段(如name、age)
- 把可能变化的行为定义成方法,而不是写死在__init__里
- 避免在父类中直接访问子类才有的属性,否则运行时报AttributeError
子类重写要分清覆盖还是扩展
重写不是为了删功能,而是为了换逻辑或加功能。覆盖是彻底替换,扩展是在父类基础上叠加。
- 完全替换:子类里直接写同名方法,比如def make_sound(self): return "喵~"
- 扩展逻辑:用super().make_sound()先执行父类逻辑,再追加自己的,比如记录日志、校验参数、触发事件
- 别混用ParentClass.method(self)和super(),容易引发重复调用或MRO混乱
多继承慎用,但要用就理清MRO
Python支持多继承,但多个父类有同名方法时,调用顺序由MRO(Method Resolution Order)决定。可以用ClassName.__mro__查看。
- 推荐用class Dog(Animal, Petable):这种清晰职责的组合,比如一个管生命行为,一个管饲养接口
- 避免class C(A, B)中A和B都实现了save()却逻辑冲突
- 真遇到冲突,显式调用:A.save(self) 或 B.save(self),不依赖MRO自动选择










