一、什么是猴子补丁?
猴子补丁:Monkey Patch,主要功能就是动态的属性的替换,模块运行时替换的功能。
二、Monkey Patch功能简介
Monkey Patch 允许在运行期间动态修改一个类或模块(注意:python中一切皆对象,包括类、方法、甚至是模块)
三、运行时动态改变类的方法
# 方法一:
class A:
def func(self):
print("Hi")
def monkey(self):
print("Hi, monkey")
a = A()
a.func()
'''运行结果
Hi
'''
# 方法二:
class A:
def func(self):
print("Hi")
def monkey(self):
print("Hi, monkey")
a = A()
A.func=A.monkey #在运行的时候,才改变了func
a.func()
'''运行结果
Hi, monkey
'''
# 方法三:
class A:
def func(self):
print("Hi")
def monkey(self):
print("Hi, monkey")
def outer_monkey(a): # a 这个参数是没有用到的,因为func有一个参数,如果这个函数没有参数的话不能这样直接赋值
print("Hi,outer monkey")
a = A()
A.func=outer_monkey
a.func()
'''运行结果
Hi, outer monkey
'''
四、总结
Monkey Path即运行时动态改变方法、类的方法。其实不管是定义在类外的普通方法、类里面的方法、甚至是模块这些都可以进行“动态替换的操作”。
五、应用场景
很多代码都会用到import json,后来发现ujson的性能更高,如果把每个文件的import json改成import ujson as json成本较高,测试一下用ujson替换json是否符合预期,只需要在入口加上:
import json
import ujson # pip3 install ujson
def monkey_patch_json():
json.__name__ = 'ujson'__name__
json.dumps = ujson.dumps
json.loads = ujson.loads
monkey_patch_json()