python中的猴子补丁Monkey Patch
什么是猴子补丁
the term monkey patch only refers to dynamic modifications of a class or module at runtime, motivated by the intent to patch existing third-party code as a workaround to a bug or feature which does not act as desired
即在运行时对方法 / 类 / 属性 / 功能进行修改,把新的代码作为解决方案代替原有的程序,也就是为其打上补丁。
为什么叫做猴子补丁
The term monkey patch seems to have come from an earlier term, guerrilla patch, which referred to changing code sneakily – and possibly incompatibly with other such patches – at runtime.The word guerrilla, homophonous with gorilla (or nearly so), became monkey, possibly to make the patch sound less intimidating. An alternative etymology is that it refers to “monkeying about” with the code (messing with it).
- 一种说法杂牌军、游击队的英文发音与猩猩相似,杂牌军、游击队不是原装军队,就像是替补,所以也就演变叫做猴子补丁
- 另一种说法“monkeying about”有胡闹,顽皮,哄骗的意思,所以叫做猴子补丁
python中使用猴子补丁
class Example(): def func1(self): print('我才是原装')def func2(*args): print('我要取代你')def func3(*args): print('都给我一边去')instance = Example()Example.func1 = func2instance.func1() # 我要取代你instance.func1 = func3instance.func1() # 都给我一边去instance2 = Example()instance2.func1() # 我要取代你
例子非常简单,func2取代的是类的方法,func3取代的是实例的方法,最终输出都不是原装
其他例子
在使用gevent模块的使用就会遇到猴子补丁
import gevent.monkey gevent.monkey.patch_all()
使用猴子补丁的方式,gevent能够修改标准库里面大部分的阻塞式系统调用,包括socket、ssl、threading和 select等模块,而变为协作式运行。也就是通过猴子补丁的monkey.patch_xxx()来将python标准库中模块或函数改成gevent中的响应的具有协程的协作式对象。这样在不改变原有代码的情况下,将应用的阻塞式方法,变成协程式的。
这里参考
注意问题
在使用猴子补丁的时候同样容易出现问题
- 当进行版本更新变化的时候,很容易对补丁做出破坏
- 不知情的情况下对一个位置打两个补丁会造成替换
- 对于不知道有补丁的人来说可能会对出现的某些情况感到困惑
参考