天天看点

猴子补丁

在运行时替换方法、属性等,动态属性替换

在不修改第三方代码的情况下增加原来不支持的功能

在运行时为内存中的对象增加patch而不是在磁盘的源代码中增加

主要用途在于源码不宜直接修改,而添加补充功能

例子:python自带的json包不支持自定义对象转json串,在python中用json.dumps转自定义对象时会报异常class is not json serializable,通过增加一段代码补丁(称作猴子补丁)便可实现自定义转换,补丁代码如下:

通过补丁代码我们可以看到,代码替换了json包的默认转json的方法,运行了补丁代码后,转json的过程变成了先找对象的to_json属性,在没有to_json属性的情况下才使用默认的jsonencoder.default的方法,也就是通过这么一个patch,增加了json包原来没有的功能。同时也不影响其他调用者使用jsonencoder.default的方法(推荐这么写,降低改变源代码的风险)

作用时期不同:猴子补丁作用于运行时,装饰器作用于定义时

由于猴子补丁是直接用新的函数地址覆盖源代码的函数地址,所以需要慎用