Python 中的多层继承

继承 是面向对象编程中的一种特性,通过该特性,类可以继承另一个类的属性和方法。在 Python 中,你可以实现不同类型的继承,比如单继承、多继承和多层继承。本章将介绍如何在 Python 中实现多层继承

Python 中的多层继承

多层继承是一种层级继承,使得一个派生类继承另一个派生类。也就是说,一个类是由另一个类推导出来的。这形成了一条继承链。

链顶端的类称为基类父类 ,中间的类称为派生类子类 ,链的最底层称为子派生类子类

以下图示展示了多层继承的概念 −

Python 中多层继承的示例

让我们来看一个例子,以理解 Python 中多层继承的工作原理 −

python 复制代码
# Base class
class Network:
    def connectivity(self):
        return "Network connects"

# Derived class
class Network_5G(Network):
    def fast_connectivity(self):
        return "5G Network provides superfast connectivity"

# Sub-derived class
class Network_5G_Airtel(Network_5G):
    def fast_and_stable_connectivity(self):
        return "Airtel 5G network is fast and remains stable"    

# Creating an instance of Network_5G_Airtel
network_object = Network_5G_Airtel()
print(network_object.connectivity())        # Inherited from Network class
print(network_object.fast_connectivity())   # Inherited from Network_5G class
print(network_object.fast_and_stable_connectivity())   # Inherited from Network_5G_Airtel class

在该代码中,Network_5G_Airtel 类继承了Network_5G 类的函数和属性,类又继承了网络 类。因此,Network_5G_Airtel 将可以使用诸如连接() (来自网络 )、(fast_connectivity() (来自Network_5G )和fast_and_stable_connectivity( )(来自Network_5G_Airtel自身)等方法。

当你运行该代码时,其输出将是 −

复制代码
Network connects
5G Network provides superfast connectivity
Airtel 5G network is fast and remains stable

Python 中多层继承的 MRO

我们考虑上述示例中的一个情景,其中Network_5G 类也有一个名为 connectivity() 的方法。那么,如果我们从 Network_5G_Airtel 类实例调用 connectivity() 方法,会发生什么?这正是方法解析令(MRO)发挥作用的地方。

我们修改前例,在Network_5G 类中加入一个**connectivity()**方法。

python 复制代码
# Base class
class Network:
    def connectivity(self):
        return "Network connects"

# Derived class
class Network_5G(Network):
    def fast_connectivity(self):
        return "5G Network provides superfast connectivity"

    def connectivity(self):
        return "5G Network connects faster"

# Sub-derived class
class Network_5G_Airtel(Network_5G):
    def fast_and_stable_connectivity(self):
        return "Airtel 5G network is fast and remains stable"

# Creating an instance of Network_5G_Airtel
obj1 = Network_5G_Airtel()
print(obj1.connectivity())  # Inherited from Network class

上述代码的输出为−

复制代码
5G Network connects faster

这表明调用的是Network_5G 类的 connectivity() 方法,而非网络类的。这是因为 Python 的方法解析顺序(MRO)采用深度优先方法,先在当前类中查找该方法,然后在父类中查找,依此类推。

要知道任何类的方法解析顺序,可以使用**mro()**方法。以下是你可以这样做的方法:

复制代码
print(Network_5G_Airtel.mro())

Output:
[<class '__main__.Network_5G_Airtel'>, <class '__main__.Network_5G'>, 
<class '__main__.Network'>, <class 'object'>]

多层继承中的覆盖方法

在多层继承中,派生类可以覆盖其父类的方法。也就是说,如果一个方法在父类和子类中都定义了,那么子类中的方法将覆盖父类的方法。

这里有一个例子,说明多层继承中方法覆盖 −

python 复制代码
# Base class
class Vehicle:
    def start(self):
        return "Vehicle starts"

# Derived class
class Car(Vehicle):
    def start(self):
        return "Car starts"

# Sub-derived class
class SportsCar(Car):
    def start(self):
        return "Sports Car starts"

# Creating an instance of SportsCar
sports_car = SportsCar()
print(sports_car.start())  # Calls the start method of SportsCar class

上述代码的输出为−

复制代码
Sports Car starts

多层继承的最佳实践

  1. 保持继承链简洁:尽量控制继承层级(建议不超过 3 层),层级过多会导致代码逻辑混乱,难以调试。
  2. 用 super () 代替手动指定父类 :尤其是初始化方法,super() 能适配 MRO 顺序,避免因继承链调整导致的错误。
  3. 避免多层重写混乱 :如果需要重写上层方法,建议在方法内先用 super() 调用上层方法,再添加自己的逻辑(保持继承链的完整性):
python 复制代码
class Child(Parent):
    def common_method(self):
        super().common_method()  # 先执行父类的方法
        print("再添加子类自己的逻辑")

结论

  1. 多层继承是 "纵向" 的继承链(子类→父类→祖父类),子类会继承所有上层类的属性和方法。
  2. 方法 / 属性查找遵循就近原则(沿 MRO 向上找第一个匹配项),子类重写会覆盖上层类的同名方法。
  3. super() 是多层继承的核心工具,能自动沿 MRO 调用上层类的方法,优先使用 super() 而非手动指定父类名,提升代码灵活性。

总之,多层继承是一种继承类型,其中一个类从另一个衍生类推导出来,形成一条继承链。方法解析顺序(MRO)将决定当继承链中存在同名方法时,调用哪种方法。方法覆盖可以通过覆盖子类中父类的方法。

相关推荐
顾林海2 小时前
Agent入门阶段-编程基础-Python:流程控制
python·agent·ai编程
呱呱复呱呱4 小时前
Django CBV 源码解读:一个请求是怎么找到你的 get() 方法的
python·django
曲幽9 小时前
刚部署的 LibreTranslate 频频翻车?我掏出了 20 年前的 StarDict 词典,用 FastAPI 搭了个本地词典翻译 API
python·fastapi·web·translate·goldendict·libretranslate·stardict·pystardict
荣码9 小时前
用Streamlit给AI应用套个界面,10行代码出Web页面
java·python
兵慌码乱19 小时前
基于Python+PyQt5+SQLite的药房管理系统实现:事务一致性与界面解耦全流程解析
python·sqlite·信号与槽·pyqt5·数据库设计·桌面应用开发·事务处理
金銀銅鐵21 小时前
[Python] 体验用欧几里得算法计算最大公约数的过程
python·数学
FreakStudio1 天前
W55MH32L-EVB 上手测评:硬件 TCP/IP 加持的以太网单片机,MicroPython 零门槛开发
python·单片机·嵌入式·大学生·面向对象·并行计算·电子diy·电子计算机
用户0332126663671 天前
使用 Python 从零创建 Word 文档
python
Csvn1 天前
Python 两大经典坑点 —— 可变默认参数 & 闭包延迟绑定
后端·python
曲幽1 天前
别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了
python·docker·web·pot·translate·libretranslate·arogstranslate