猴子补丁

一. 什么是猴子补丁?

这个词原来为Guerrilla Patch,杂牌军、游击队,说明这部分不是原装的,在英文里guerilla发音和gorllia(猩猩)相似,再后来就写了monkey(猴子)。
还有一种解释是说由于这种方式将原来的代码弄乱了(messing with it),在英文里叫monkeying about(顽皮的),所以叫做Monkey Patch。

名字听起来稀奇古怪的, 跟python的这个功能搭不上边, 所以我们直接来说功能吧!

二. 猴子补丁的功能(一切皆对象)

拥有在模块运行时替换的功能, 例如: 一个函数对象赋值给另外一个函数对象(把函数原本的执行的功能给替换了)

class Monkey():
    def play(self):
        print('猴子在玩')


class Dog():
    def play(self):
        print('狗子在玩')


m = Monkey()
m.play()
m.play = Dog().play
m.play()

三. monkey patch的应用场景

这里有一个比较实用的例子,很多用到import json, 后来发现ujson性能更高,如果觉得把每个文件的import json改成import ujson as json成本较高, 或者说想测试一下ujson替换是否符合预期, 只需要在入口加上:

import json
import ujson


def monkey_patch_json():
    json.__name__ = ujson.__name__
    json.dumps = ujson.dumps
    json.loads = ujson.loads


monkey_patch_json()
aa = json.dumps({'name': 'lqz', 'age': 19})
print(aa)
posted @ 2020-09-08 16:26  给你加马桶唱疏通  阅读(152)  评论(0编辑  收藏  举报