Python 继承知识体系思维导图
详细知识点与代码整理
1. 继承的基本概念与语法
继承是面向对象编程的核心特性之一,它允许我们基于一个已存在的类来创建新类。
-
定义:一个类(子类)获取另一个类(父类)的公有属性和方法。
-
派生:从一个已有的类(父类)产生一个新的类(子类)的过程。
-
术语:
- 父类/基类:被继承的类。
- 子类/派生类:继承别人的类。
-
语法:
class 子类名(父类名): -
特性:Python 中所有类默认都继承自
object类。
2. 单继承与多层继承
单继承是最简单的继承形式。继承具有传递性,如果 A 继承 B,B 继承 C,那么 A 也继承 C。
# 定义一个人类 (父类)
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 支持一个子类同时继承多个父类。
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 顺序调用下一个类的方法,比直接使用父类名.方法()更灵活。
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 算法会保证每个类只出现一次,并且子类总是在父类之前被查找。
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'>)