【Python网络编程】03_三大特性之继承

Python 继承知识体系思维导图


详细知识点与代码整理

1. 继承的基本概念与语法

继承是面向对象编程的核心特性之一,它允许我们基于一个已存在的类来创建新类。

  • 定义:一个类(子类)获取另一个类(父类)的公有属性和方法。

  • 派生:从一个已有的类(父类)产生一个新的类(子类)的过程。

  • 术语

    • 父类/基类:被继承的类。
    • 子类/派生类:继承别人的类。
  • 语法class 子类名(父类名):

  • 特性 :Python 中所有类默认都继承自 object 类。

2. 单继承与多层继承

单继承是最简单的继承形式。继承具有传递性,如果 A 继承 B,B 继承 C,那么 A 也继承 C。

ruby 复制代码
# 定义一个人类 (父类)
class Person(object):
    def speak(self):
        print("我拥有说话的能力")

    def walk(self):
        print("我拥有走路的能力")

# 定义学生类继承于人类 (子类)
class Student(Person):
    pass

# 定义大学生类继承于学生类 (多层继承)
class CollegeStudent(Student):
    pass

# 创建大学生对象
college_stu = CollegeStudent()
# 大学生类虽然没有定义speak和walk,但因为继承关系,依然可以使用
college_stu.speak()  # 输出: 我拥有说话的能力
college_stu.walk()   # 输出: 我拥有走路的能力

3. 多继承

Python 支持一个子类同时继承多个父类。

python 复制代码
class Car(object):
    def __init__(self):
        self.name = "汽车"
        self.wheel = 4

    def run(self):
        print("我拥有行驶的能力")

class OilCar(Car):
    """汽油车"""
    def power(self):
        print("我拥有燃油动力")

class ElectricCar(Car):
    """电动车"""
    def power(self):
        print("我拥有电池动力")

# 混动车同时继承汽油车和电动车
class HybridCar(OilCar, ElectricCar):
    pass

# 创建混合车对象
hybrid_car = HybridCar()
hybrid_car.oil_power()      # 调用 OilCar 的方法
hybrid_car.electric_power() # 调用 ElectricCar 的方法
hybrid_car.run()            # 调用 Car 的方法
print(hybrid_car.name)      # 访问 Car 的属性

4. 方法重写与 super() 函数

子类可以重新定义父类的方法,以提供个性化的实现,这称为方法重写。当子类调用该方法时,会执行子类中重写的版本。

  • super() 函数 :用于调用父类的方法。在多继承中,它会根据 MRO 顺序调用下一个类的方法,比直接使用 父类名.方法() 更灵活。
python 复制代码
class HybridCar(OilCar, ElectricCar):
    def __init__(self, battery):
        # super().__init__() 会根据MRO顺序调用父类的__init__
        # 在这里,它会跳过OilCar和ElectricCar,直接调用Car的__init__
        super().__init__() 
        self.battery = battery

    def power(self):
        # 重写power方法,实现混合动力
        print(f"我是{self.name}, 我有{self.wheel}个轮子")
        # 可以分别调用不同父类的power方法
        OilCar.power(self)
        ElectricCar.power(self)
        print("我拥有燃油和电池的混合动力")

hybrid_car = HybridCar("大容量电池")
hybrid_car.power()

5. MRO (Method Resolution Order)

MRO,即方法解析顺序,决定了在多继承中,当调用一个方法时,Python 应该按照什么顺序去查找。

  • Python 使用 C3 线性化算法 来计算 MRO。
  • 可以通过 类名.__mro__类名.mro() 来查看一个类的 MRO 列表。
  • 查找顺序遵循"从左到右,深度优先"的原则,但 C3 算法会保证每个类只出现一次,并且子类总是在父类之前被查找。
python 复制代码
class A(object):
    def __init__(self):
        print("A")

class B(A):
    def __init__(self):
        print("B")
        super().__init__()

class C(A):
    def __init__(self):
        print("C")
        super().__init__()

class D(B, C):
    def __init__(self):
        print("D")
        super().__init__()

# 创建 D 的实例,观察执行顺序
d = D()
# 输出:
# D
# B
# C
# A

# 查看 D 类的 MRO
print(D.__mro__)
# 输出: (<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
相关推荐
qq_372906932 小时前
如何用 CustomEvent 构造函数创建携带自定义数据的事件
jvm·数据库·python
m0_515098422 小时前
为什么宝塔面板误删网站数据库无法通过回收站恢复_需依赖面板先前的定时备份或底层数据快照
jvm·数据库·python
立莹Sir2 小时前
JVM深度解析与实战指南:从源码到生产环境优化
开发语言·jvm·python
weixin_381288182 小时前
如何防止SQL触发器导致性能下降_通过精简触发器逻辑
jvm·数据库·python
解救女汉子2 小时前
MongoDB 聚合管道中处理空值以正确计算百分比完成度
jvm·数据库·python
2301_773553622 小时前
bootstrap怎么修改模态框(Modal)背景遮罩层的颜色
jvm·数据库·python
花月C2 小时前
Python Web框架-FastAPI
python·fastapi
尘埃落定wf2 小时前
2026 年 LangChain (记忆)Memory 怎么用?三个核心类 + 完整代码示例
开发语言·前端·python
m0_674294642 小时前
TypeScript 5.2 升级引发 NestJS 构建失败的解决方案
jvm·数据库·python