小甲鱼Python学习笔记

课程开篇 & 学习背景

  • 前置铺垫:上节课作业(乌龟吃鱼游戏),鱼类只有单一类型
  • 本节课需求:扩展鱼类(金鱼、鲤鱼、三文鱼、鲨鱼),避免重复定义相似代码
  • 核心知识点:Python 继承机制(解决类的共性复用问题)

一、继承的基础概念 & 语法

  • 核心逻辑:子类复用父类的属性+方法,无需重复编写相似代码
  • 相关名词
    • 父类/基类/超类:被继承的类
    • 子类:继承者,可继承父类所有内容
  • 基础语法:class 子类名(父类名):
  • 基础特性:子类无自定义内容时,完全继承父类功能

二、子类的「重写」特性

  • 定义:子类定义与父类同名的属性/方法
  • 效果:子类调用时,自动覆盖父类的同名内容
  • 注意点:仅覆盖子类自身的调用效果,父类本身不受任何影响

三、鱼类继承案例实操(核心演示)

    1. 定义父类:class Fish()
    • init 初始化:随机生成x、y轴坐标(import random)
    • move() 方法:鱼统一向西游(x坐标-1),打印移动后位置
    1. 定义普通子类(纯继承)
    • 金鱼Goldfish、鲤鱼Carp、三文鱼Salmon
    • 语法:class 子类名(Fish): pass
    • 特性:直接拥有父类的坐标初始化+move()游动方法
    1. 定义特殊子类: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()
  • 核心优势
    1. 无需写父类名,自动查找父类对应方法
    2. 无需传self参数,自动传参
    3. 适配多层继承/继承关系变更,只需改子类括号的父类名即可
    4. 多层继承时自动逐层查找所有父类的对应方法
  • 最终效果:子类既保留父类的初始化属性,又拥有自定义的hungry和eat()方法

五、Python的多重继承

  • 定义:子类同时继承多个父类的属性和方法
  • 语法:class 子类名(父类1, 父类2, ...):
  • 基础效果:子类可调用所有父类的方法/属性
  • 重要提醒:语法简单但极易造成代码逻辑混乱,引发不可预见的BUG
  • 建议:非绝对必要,尽量避免使用多重继承

本节课核心总结

  • 继承的核心价值:复用代码、减少冗余,实现类的功能拓展
  • 子类重写会覆盖父类,需手动调用父类方法补全功能
  • super()函数是解决继承覆盖的最优解,优先使用
  • 多重继承慎用,避免代码维护困难