[ ]
ZhouSa.com 1. 使用猴子补丁在运行时对代码进行修改
Monkey patch就是在运行时对已有的代码进行修改,达到hot patch的目的
在运行时修改类或模块,而不改动源码,这种技术叫猴子补丁. 猴子补丁很强大,但是打补丁的代码与要打补丁的程序耦合十分紧密,而且往往要处理隐藏和没有文档的部分
需要注意实验猴子补丁或者热更新必须使用import xxxx
这样的语法导入模块,用from语法无效
1.1. 使用猴子补丁在运行时修改模块中的对象
例: 修改math
模块中pi
和e
的值
import math
math.pi
3.141592653589793
math.pi = 3.14
math.pi
3.14
math.e
2.718281828459045
def patch_math(): math.e = 2.72
patch_math()
math.e
math.pi
1
1.2. 取消猴子补丁
取消猴子补丁需要先取消模块的引入,之后再重新引入即可.
模块引入后会存放在sys.modules这个字典中.因此,要取消引入,只要删除该字典中的对应值即可
math.pi
2
math.pi
3
math.pi
4
math.e
math.pi
6
math.pi
7
math.pi
6
math.pi
9
math.e
2.718281828459045
math.pi
7
2.718281828459045
需要注意我们往往会将猴子补丁单独写在一个模块中,这种时候猴子补丁的执行函数需要先执行,再导入被打补丁的模块才能生效
2. 热更新
另一个用于热更新的方式是使用importlib.reload
方法
3.141592653589793
4
3.141592653589793
5
3.141592653589793
6
3.141592653589793
7
3.141592653589793
8
3.141592653589793
9
math.pi = 3.14
0
math.pi = 3.14
1
3.141592653589793
5
math.pi = 3.14
3
math.pi = 3.14
4
math.pi = 3.14
5
3.141592653589793
7
math.pi = 3.14
7
3.141592653589793
9
math.pi = 3.14
9
还没有评论,来说两句吧...