news 2026/6/1 11:28:48

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/5/30 15:42:41

Forza Painter终极指南:3步将任何图片变身高品质赛车涂装

Forza Painter终极指南&#xff1a;3步将任何图片变身高品质赛车涂装 【免费下载链接】forza-painter Import images into Forza 项目地址: https://gitcode.com/gh_mirrors/fo/forza-painter 想要在《极限竞速&#xff1a;地平线》中拥有独一无二的车辆涂装吗&#xff…

作者头像 李华
网站建设 2026/6/1 7:26:50

AMD显卡AI绘画完全解锁指南:从零基础到创作高手

AMD显卡AI绘画完全解锁指南&#xff1a;从零基础到创作高手 【免费下载链接】ComfyUI-Zluda The most powerful and modular stable diffusion GUI, api and backend with a graph/nodes interface. Now ZLUDA enhanced for better AMD GPU performance. 项目地址: https://g…

作者头像 李华
网站建设 2026/5/30 16:27:14

Path of Building PoE2完整指南:构建完美角色的终极工具

Path of Building PoE2完整指南&#xff1a;构建完美角色的终极工具 【免费下载链接】PathOfBuilding-PoE2 项目地址: https://gitcode.com/GitHub_Trending/pa/PathOfBuilding-PoE2 还在为《流放之路2》中复杂的技能搭配和装备选择而困惑吗&#xff1f;Path of Buildi…

作者头像 李华
网站建设 2026/5/30 16:26:56

从CC1到CC7:Java反序列化漏洞攻防全景解析

Java反序列化漏洞是Java生态系统中最具破坏性的安全威胁之一&#xff0c;而Apache Commons Collections&#xff08;CC&#xff09;系列漏洞&#xff08;CC1~CC7&#xff09; 堪称这类漏洞的“标杆样本”。它们依托Commons Collections工具包的设计缺陷&#xff0c;让攻击者能通…

作者头像 李华
网站建设 2026/5/30 16:26:55

MisakaX终极定制:iOS设备深度个性化完整指南

MisakaX终极定制&#xff1a;iOS设备深度个性化完整指南 【免费下载链接】misakaX iOS /iPadOS 16.0 - 18.0 / 18.1 beta 4, An ultimate customization tool, uilitizing the bug that makes TrollRestore possible. 项目地址: https://gitcode.com/gh_mirrors/mi/misakaX …

作者头像 李华