有勇气的牛排博客

Python 高级特性 猴子补丁(Monkey Patching)

有勇气的牛排 26 Python 2025-07-27 22:51:51

1 前言

1.1 定义

Monkey Paching 是指在程序运行时,动态地修改模块、类或对象的 属性方法函数实现

简单理解:

在不修改源码的情况下,通过运行时“插手”改变代码行为。

1.2 猴子补丁的特征

特征 说明
动态修改 在运行时进行修改,而非编译期或静态定义
无需修改原始代码 可直接替换第三方库中的方法或属性
灵活强大 可以快速修改bug、添加日志、做测试 mock
有风险 会影响全局行为,难以调试、维护,肯呢个引入隐藏bug

2 基本案例

2.1 替换类的方法

# -*- coding: utf-8 -*- class MyClass: def greet(self): print("你好") def new_greet(self): print("你好呀") # 打补丁 MyClass.greet = new_greet obj = MyClass() obj.greet() # 输出: 你好呀

2.2 替换内建模块方法

# -*- coding: utf-8 -*- import time def fake_sleep(seconds): print(f"正在等待 {seconds} 秒...") # 给time.sleep 打补丁 time.sleep = fake_sleep time.sleep(3)

image.png

3 Mokey Patching 的风险

  • 维护成本高:被人无法一眼看出代码被修改过。
  • 调试困难:难以追踪方法为何行为异常。
  • 依赖内部实现:一旦第三方开库升级,补丁可能失效或报错。
  • 污染全局状态:所有使用该方法的地方都会影响。

4 典型场景用途

场景 示例
测试中 mock 系统函数 替换time.sleepos.path.exist 避免实际等待或依赖
修复第三方库bug 替换其内部方法逻辑(热修复)
添加日志或监控 在不修改源码的前提下加埋点或日志
框架底层 hook 插件机制 替换默认行为,如 flask 中间件修改 request 随想

5 面试回答

Monkey Pathing 是一种在运行时动态修改类或模块的方法或属性的技术,它允许我们不修改原始源码,就能更改第三方库或对象的行为。虽然灵活,但容易带来维护困难和隐藏bug,通常只建议用于测试、调试或临时修复场景。

评论区

×
×