课程开篇 & 学习背景
- 前置铺垫:上节课作业(乌龟吃鱼游戏),鱼类只有单一类型
- 本节课需求:扩展鱼类(金鱼、鲤鱼、三文鱼、鲨鱼),避免重复定义相似代码
- 核心知识点:Python 继承机制(解决类的共性复用问题)
一、继承的基础概念 & 语法
- 核心逻辑:子类复用父类的属性+方法,无需重复编写相似代码
- 相关名词
- 父类/基类/超类:被继承的类
- 子类:继承者,可继承父类所有内容
- 基础语法:class 子类名(父类名):
- 基础特性:子类无自定义内容时,完全继承父类功能
二、子类的「重写」特性
- 定义:子类定义与父类同名的属性/方法
- 效果:子类调用时,自动覆盖父类的同名内容
- 注意点:仅覆盖子类自身的调用效果,父类本身不受任何影响
三、鱼类继承案例实操(核心演示)
-
- 定义父类:class Fish()
- init 初始化:随机生成x、y轴坐标(import random)
- move() 方法:鱼统一向西游(x坐标-1),打印移动后位置
-
- 定义普通子类(纯继承)
- 金鱼Goldfish、鲤鱼Carp、三文鱼Salmon
- 语法:class 子类名(Fish): pass
- 特性:直接拥有父类的坐标初始化+move()游动方法
-
- 定义特殊子类:class Shark(Fish)(重点报错案例)
- 自定义内容:新增hungry布尔属性(是否饥饿)、eat()吃的方法
- 报错原因:子类重写了__init__方法,覆盖了父类的__init__,未初始化x/y坐标
- 报错结果:调用move()时提示Shark对象无x属性
四、解决子类重写覆盖的2种核心方案
✅ 方案1:调用「未绑定的父类方法」
- 语法:在子类__init__中写 父类名.init(self)
- 作用:手动调用父类的初始化方法,补全父类的属性(x/y)
- 特点:需手动写父类名,需传self参数;self是子类实例,非父类实例 → 「未绑定」由来
✅ 方案2:使用super()函数【推荐最优方案】
- 语法:在子类__init__中写 super().init()
- 核心优势
- 无需写父类名,自动查找父类对应方法
- 无需传self参数,自动传参
- 适配多层继承/继承关系变更,只需改子类括号的父类名即可
- 多层继承时自动逐层查找所有父类的对应方法
- 最终效果:子类既保留父类的初始化属性,又拥有自定义的hungry和eat()方法
五、Python的多重继承
- 定义:子类同时继承多个父类的属性和方法
- 语法:class 子类名(父类1, 父类2, ...):
- 基础效果:子类可调用所有父类的方法/属性
- 重要提醒:语法简单但极易造成代码逻辑混乱,引发不可预见的BUG
- 建议:非绝对必要,尽量避免使用多重继承
本节课核心总结
- 继承的核心价值:复用代码、减少冗余,实现类的功能拓展
- 子类重写会覆盖父类,需手动调用父类方法补全功能
- super()函数是解决继承覆盖的最优解,优先使用
- 多重继承慎用,避免代码维护困难