类方法重写代码解析
这段代码展示了 Python 中方法重写(Method Overriding)和多继承结构的经典示例。
完整类层次结构
A (基类)
/ \\
B C (子类,都继承自A)
\\ /
D (多继承,同时继承B和C)
第2-3行代码分析
class A:
def show(self):
print("A")
核心组件:
- 基类 A:定义了一个基础方法 show()
- 方法签名:def show(self) – 实例方法,接收 self 参数
- 实现:打印字符串 “A”
类继承与重写链
class A: # 基类
def show(self):
print("A") # 初始实现
class B(A): # 继承 A
def show(self): # 重写 A.show()
print("B") # 新实现
class C(A): # 继承 A
def show(self): # 重写 A.show()
print("C") # 新实现
class D(B, C): # 多继承 B 和 C
def show(self): # 重写 B.show() 和 C.show()
print("D") # 最终实现
方法解析顺序(MRO)
d = D()
d.show() # 输出: D
调用流程:
D.show() → 直接找到,调用 D 的实现
MRO 查看方式:
print(D.__mro__)
# 输出: (<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
如果 D 不重写 show()
假设第13-15行被注释:
# class D(B, C):
# def show(self):
# print("D")
d = D()
d.show() # 输出: B (根据MRO,先查找B)
方法重写的核心概念
1. 重写(Override)
- 子类提供与父类相同签名的方法
- 子类实现完全替换父类实现
- 这是多态的基础
2. 访问父类方法
class D(B, C):
def show(self):
super().show() # 调用 B.show()(MRO中的下一个)
print("D")
3. 特定父类调用
class D(B, C):
def show(self):
A.show(self) # 直接调用 A 的方法
print("D")
设计模式应用
模板方法模式:
class A:
def process(self):
self.prepare()
self.execute()
self.cleanup()
def prepare(self):
print("A: prepare")
def execute(self):
print("A: execute")
def cleanup(self):
print("A: cleanup")
class B(A):
def execute(self): # 只重写特定步骤
print("B: custom execute")
b = B()
b.process()
# 输出:
# A: prepare
# B: custom execute
# A: cleanup
关键设计决策
1. 方法签名一致性
# ✅ 正确重写
class B(A):
def show(self): # 相同签名
print("B")
# ❌ 不是重写,而是新方法
class B(A):
def show(self, extra): # 签名不同
print("B")
2. 返回类型兼容性
- 建议子类返回类型与父类兼容(协变)
- 返回更具体的类型通常是可以的
3. 行为契约
- 重写应保持父类方法的基本语义
- 遵循"里氏替换原则"(Liskov Substitution Principle)
学习要点
这是面向对象编程中实现多态的核心机制之一。




