Python技术迷

python面试题:什么是猴子补丁?

那天我在咖啡店坐着,旁边一桌小伙子在聊面试题,说到 Python 的猴子补丁,结果三个人居然吵起来了。一个说“这玩意儿就是骚操作”,另一个说“实际项目里根本不能用”,还有一个坚持“用得好就是救命的神技”。我一边喝着美式一边偷笑,这不就是面试里经常考的那个点嘛。

猴子补丁到底是啥?

简单讲,猴子补丁(Monkey Patch)就是在运行时动态修改类或模块的属性和方法。听起来有点叛逆,对吧?平时我们习惯写好类再调用,可猴子补丁直接就把方法给换了,甚至原作者都不知道。比如你写了个类,有个方法返回固定的字符串,我就能在运行时把它“偷偷”换掉。

随手来段代码你就明白了:

classDog:
defbark(self):
return"woof!"

dog = Dog()
print(dog.bark())  # 输出: woof!

# 来个猴子补丁
deffake_bark(self):
return"meow?"

Dog.bark = fake_bark

print(dog.bark())  # 输出: meow?

原本是一条好好的狗,结果被我打了个猴子补丁,现在开始学猫叫了。

为什么会有猴子补丁?

这个问题我以前在公司楼下抽烟的时候也和同事聊过。他说,有时候第三方库里有 bug,但我们又没法立刻等作者修复或者发新版本,那咋办?最直接的办法就是在本地“临时修”一下,这就需要猴子补丁。等官方更新了,再把这个补丁移除。说白了就是个应急措施。

我当时举了个例子,Flask 早期版本里有些小毛病,很多人就在项目启动的时候用猴子补丁把它覆盖掉。就像衣服破了个口子,你先拿订书机给夹上,不漂亮,但能顶一阵子。

使用场景和风险

我得实话实说,猴子补丁不是啥光明正大的操作。它的优点是立竿见影,你改完马上生效,不用重新编译、不用大改架构。但是缺点也致命:

  1. 可维护性差 —— 过几个月你自己都忘了当时打了补丁,别人接手项目还得骂你。
  2. 升级风险 —— 依赖库一旦升级,补丁可能就失效或者导致更大的 bug。
  3. 调试困难 —— 看代码的人以为用的是原方法,结果跑出来发现行为完全不一样,迷惑性极强。

我有个朋友在外企工作,他跟我说过一个惨痛的经历:团队里有人偷偷用了猴子补丁改 requests 库的行为,结果线上日志里出现一堆奇怪的响应,最后排查了两天才发现是那几行补丁代码搞的鬼。

更加实际的例子

假设我们用 datetime 模块获取当前时间,可是写单元测试的时候,总不能真的等时间流逝吧?这时候猴子补丁就有用了。比如:

import datetime

defget_today():
return datetime.date.today()

print(get_today())  # 比如输出 2025-08-25

# 打猴子补丁
deffake_today():
return datetime.date(2000, 1, 1)

datetime.date.today = fake_today

print(get_today())  # 输出 2000-01-01

这样在测试里就能保证结果稳定,不会每天都变。这类场景后来也演变出更正规的方法,比如 unittest.mock,它其实就是对猴子补丁的一种“官方化包装”。

那么面试里该怎么回答?

如果你在面试中被问到“猴子补丁是什么”,别光说定义,最好能结合场景和利弊一起讲。比如可以这么组织语言:

  • 猴子补丁是运行时动态修改对象或模块的方法。
  • 典型用途是临时修复第三方库的 bug,或者在测试中模拟行为。
  • 优点是快速生效,缺点是可维护性差,风险大。
  • 在生产环境中不建议长期使用,更推荐用 mock 或者官方支持的配置项。

如果能顺便写一小段代码示例,面试官一般就会觉得你不仅知道概念,还动过手。

一点小感慨

我个人对猴子补丁的态度挺微妙的。就像深夜写代码时突然很饿,冰箱里只有方便面,你说吃不吃?当然吃。但要天天靠它过日子,身体肯定垮。所以猴子补丁也是,救急可以,长期依赖就完蛋。

有意思的是,很多 Python 框架自己内部其实也用过猴子补丁,比如 gevent 就会替换掉 socket,让同步代码看起来像异步一样跑。你以为自己写的是阻塞 IO,其实底下已经被改造过了。所以啊,别太看不起猴子补丁,它在一些高级玩法里还是挺重要的。

总结一句

猴子补丁就是一把“双刃剑”。你用它,可以快速搞定问题;你滥用它,问题可能会比原来更大。面试的时候,既要能写个例子证明你懂,也要敢于说出它的缺点,表现出工程上的理性态度。

反正猴子补丁这东西你记住一句:能不用就别用,用的时候一定得留下清晰的注释,不然下一个踩坑的就是你自己。

-END-

我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html

🔥虎哥私藏精品🔥

虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领