news 2026/4/18 11:53:27

Python---继承---单继承和多继承

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python---继承---单继承和多继承

一、继承的核心本质

继承是面向对象(OOP)的三大特性(封装、继承、多态)之一,核心价值是:

  • 代码复用:子类无需重复编写父类已有的属性和方法;
  • 功能拓展:子类可在父类基础上新增功能,或重写父类方法适配自身需求;
  • 层级管理:通过类的层级关系梳理业务逻辑(如「动物」→「哺乳动物」→「猫」)。

二、单继承(推荐优先使用)

单继承指子类仅继承一个父类,是 Python 中最安全、最易维护的继承方式,几乎覆盖 90% 以上的继承场景。

1. 基础语法与示例

python

# 定义父类(基类) class Animal: # 父类属性 species = "动物" # 父类初始化方法 def __init__(self, name, age): self.name = name # 实例属性:名字 self.age = age # 实例属性:年龄 # 父类通用方法 def eat(self): print(f"{self.name}正在进食") def sleep(self): print(f"{self.name}正在睡觉") # 定义子类(派生类),继承Animal class Cat(Animal): # 子类新增属性 species = "猫科动物" # 子类重写父类方法(定制化逻辑) def eat(self): # 先调用父类的eat方法(保留通用逻辑) super().eat() # 新增子类专属逻辑 print(f"{self.name}喜欢吃小鱼干") # 子类新增方法 def catch_mouse(self): print(f"{self.name}正在抓老鼠") # 测试单继承 if __name__ == "__main__": # 创建子类实例 tom = Cat("汤姆", 3) # 访问父类继承的属性/方法 print(tom.species) # 输出:猫科动物(子类重写了父类属性) print(tom.name) # 输出:汤姆(继承父类的实例属性) tom.sleep() # 输出:汤姆正在睡觉(继承父类方法) # 调用重写后的方法 tom.eat() # 输出: # 汤姆正在进食 # 汤姆喜欢吃小鱼干 # 调用子类新增方法 tom.catch_mouse() # 输出:汤姆正在抓老鼠
2. 关键知识点
  • super()函数:核心作用是按继承顺序调用父类的方法,即使子类重写了父类方法,也能保留父类的通用逻辑;
  • 查找顺序:子类 → 父类 → 父类的父类 → ... →object(Python 所有类的默认基类);
  • 重写规则:子类方法名与父类一致时,会覆盖父类方法,通过super()可调用被覆盖的父类方法。

三、多继承(谨慎使用)

多继承指子类同时继承多个父类,可以复用多个类的功能,但容易出现「方法冲突」「菱形继承」等问题,需严格遵循 MRO 规则。

1. 基础语法与示例

python

# 父类1:会跑的能力 class Runnable: def run(self): print(f"{self.name}正在快速奔跑") # 父类2:会游泳的能力 class Swimmable: def swim(self): print(f"{self.name}正在游泳") # 父类3:基础动物类(与单继承示例一致) class Animal: def __init__(self, name): self.name = name # 子类:继承Animal + Runnable + Swimmable(多继承) class Dog(Animal, Runnable, Swimmable): # 子类新增专属方法 def bark(self): print(f"{self.name}正在汪汪叫") # 测试多继承 if __name__ == "__main__": wangcai = Dog("旺财") # 调用不同父类的方法 wangcai.run() # 输出:旺财正在快速奔跑(继承Runnable) wangcai.swim() # 输出:旺财正在游泳(继承Swimmable) wangcai.bark() # 输出:旺财正在汪汪叫(子类自身方法)
2. 核心问题:方法解析顺序(MRO)

多继承的核心是MRO(Method Resolution Order),即子类查找方法 / 属性的优先级顺序:

  • Python3 使用「C3 算法」计算 MRO,保证顺序唯一且避免重复调用;
  • 查看 MRO 的方式:类名.__mro__类名.mro()
  • 规则:先找子类自身 → 按继承列表的顺序找父类 → 找父类的共同父类 →object

示例:MRO 与方法冲突

python

# 两个父类有同名方法 class A: def show(self): print("我是A类的show方法") class B: def show(self): print("我是B类的show方法") # 子类继承A和B,继承顺序决定优先调用哪个父类的方法 class C(A, B): pass # 测试 c = C() c.show() # 输出:我是A类的show方法(因为继承顺序是A在前) print(C.__mro__) # 输出:(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
3. 经典坑点:菱形继承

当多个父类最终继承自同一个基类时,会形成 “菱形” 结构,super()结合 MRO 可避免基类方法被重复调用:

python

# 顶层基类 class Top: def __init__(self): print("Top初始化") # 父类1:继承Top class Left(Top): def __init__(self): super().__init__() # 按MRO调用下一个类的__init__ print("Left初始化") # 父类2:继承Top class Right(Top): def __init__(self): super().__init__() # 按MRO调用下一个类的__init__ print("Right初始化") # 子类:继承Left和Right(菱形结构) class Bottom(Left, Right): def __init__(self): super().__init__() # 按MRO调用Left的__init__ print("Bottom初始化") # 测试:Top仅被调用1次(MRO的作用) b = Bottom() # 输出顺序: # Top初始化 # Right初始化 # Left初始化 # Bottom初始化 print(Bottom.__mro__) # Bottom → Left → Right → Top → object

四、单继承 vs 多继承(核心对比)

维度单继承多继承
复杂度低,逻辑清晰,易维护高,易出现方法冲突、逻辑混乱
适用场景绝大多数业务场景(推荐)特殊场景(如 Mixin 工具类)
风险几乎无风险需关注 MRO、方法冲突
典型用法业务类层级拓展(如 Animal→Cat)功能混合(如 Runnable+Swimmable→Dog)

五、实战最佳实践

  1. 优先用单继承:90% 以上的场景用单继承即可满足需求,逻辑简单、维护成本低;
  2. 多继承只用于 Mixin 类:Mixin 类是 “功能片段类”(如 Runnable、Swimmable),仅提供方法,不单独实例化,命名以 “Mixin” 结尾(如RunnableMixin);
  3. 避免同名方法:多继承时,尽量保证父类之间无同名方法,减少冲突;
  4. 用 super () 而非直接调用父类super()遵循 MRO,避免硬编码父类名导致的逻辑错误;
  5. 组合替代继承:如果多继承逻辑复杂,可通过 “组合”(将其他类作为实例属性)替代,更灵活。

总结

  1. 单继承是 Python 继承的主流方式,子类仅继承一个父类,通过super()调用父类方法,逻辑清晰、易维护;
  2. 多继承允许子类继承多个父类,核心是 MRO(方法解析顺序),需注意方法冲突和菱形继承问题,仅在 Mixin 等特殊场景使用;
  3. 实际开发中优先选择单继承,多继承需严格遵循 MRO 规则,或用 “组合” 替代以降低复杂度。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 9:21:21

LeetDown终极指南:macOS平台A6/A7设备完整降级教程

LeetDown终极指南&#xff1a;macOS平台A6/A7设备完整降级教程 【免费下载链接】LeetDown a GUI macOS Downgrade Tool for A6 and A7 iDevices 项目地址: https://gitcode.com/gh_mirrors/le/LeetDown 还在为复杂的iOS设备降级而头疼吗&#xff1f;&#x1f914; LeetD…

作者头像 李华
网站建设 2026/4/14 10:45:19

Firecrawl网页数据提取工具:从入门到实战的完整指南

Firecrawl网页数据提取工具&#xff1a;从入门到实战的完整指南 【免费下载链接】firecrawl &#x1f525; Turn entire websites into LLM-ready markdown 项目地址: https://gitcode.com/GitHub_Trending/fi/firecrawl 还在为如何高效获取网页数据而烦恼吗&#xff1f…

作者头像 李华
网站建设 2026/4/17 15:58:40

告别重复点击:MaaYuan让你重新爱上游戏时光

告别重复点击&#xff1a;MaaYuan让你重新爱上游戏时光 【免费下载链接】MaaYuan 代号鸢 / 如鸢 一键长草小助手 项目地址: https://gitcode.com/gh_mirrors/ma/MaaYuan 每天登录游戏做任务是不是让你感到疲惫&#xff1f;那些重复的点击、机械的操作&#xff0c;不仅消…

作者头像 李华
网站建设 2026/4/18 5:31:43

Bodymovin动画导出终极指南:从原理到实战的完整配置方案

Bodymovin动画导出终极指南&#xff1a;从原理到实战的完整配置方案 【免费下载链接】bodymovin-extension Bodymovin UI extension panel 项目地址: https://gitcode.com/gh_mirrors/bod/bodymovin-extension 作为一名长期从事动画制作的技术专家&#xff0c;我发现Bod…

作者头像 李华
网站建设 2026/4/17 18:55:23

3步搞定!MaaYuan游戏自动化助手让你的代号鸢轻松挂机

3步搞定&#xff01;MaaYuan游戏自动化助手让你的代号鸢轻松挂机 【免费下载链接】MaaYuan 代号鸢 / 如鸢 一键长草小助手 项目地址: https://gitcode.com/gh_mirrors/ma/MaaYuan 还在为代号鸢的重复日常任务感到疲惫吗&#xff1f;MaaYuan游戏自动化助手为你带来革命性…

作者头像 李华
网站建设 2026/4/18 2:11:24

Winhance中文版:重塑Windows系统性能新体验

Winhance中文版&#xff1a;重塑Windows系统性能新体验 【免费下载链接】Winhance-zh_CN A Chinese version of Winhance. PowerShell GUI application designed to optimize and customize your Windows experience. 项目地址: https://gitcode.com/gh_mirrors/wi/Winhance-…

作者头像 李华