猴子补丁

发布时间 2023-11-12 11:43:34作者: PiggThird

什么是猴子补丁?

# 只是一个概念,不属于任何包和模块
# 利用了python一切皆对象的理念,在程序运行过程中,动态修改方法
# 概念
class Monkey():
    def play(self):
        print('猴子在玩')


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

m=Monkey()
# m.play()  # 猴子在玩
m.play=Dog().play

m.play()  # 狗子在玩  被动态修改了

有什么用?

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

import json
import ujson

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

aa=json.dumps({'name':'tiger','age':18})  # 这时候所有的json.dumps其实是ujson.dumps
print(aa)

协程:单线程下实现并发

from gevent import monkey;monkey.patch_all()
import gevent
import time
def eat():
    print('eat food 1')
    time.sleep(2)      # 实际是gevent.sleep(2)
    print('eat food 2')

def play():
    print('play 1')
    time.sleep(1)      # 实际是gevent.sleep(1)
    print('play 2')

g1=gevent.spawn(eat)
g2=gevent.spawn(play)
gevent.joinall([g1,g2])
print('主')