欢迎光临
我们一直在努力

python 类方法重写代码解析 【收藏】

类方法重写代码解析

这段代码展示了 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)

学习要点

  • 多态基础:重写使不同类可以响应相同消息
  • MRO 机制:Python 使用 C3 算法解析多继承的方法查找
  • 继承 vs 组合:优先考虑组合而非继承(“组合优于继承”)
  • Open/Closed 原则:对扩展开放,对修改封闭
  • 这是面向对象编程中实现多态的核心机制之一。

    赞(0)
    未经允许不得转载:171主机测评 » python 类方法重写代码解析 【收藏】
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址