首页 > 编程语言 >Python学习笔记-常用模块介绍--猴子补丁

Python学习笔记-常用模块介绍--猴子补丁

时间:2023-01-11 18:57:04浏览次数:59  
标签:monkey Python ujson 补丁 -- json 模块 world

1.什么是猴子补丁?

  • 属性在运行时的动态替换,叫做猴子补丁(Monkey Patch)【发音 ˈmʌŋki pætʃ】

  • 是一种思想,应用于团队引用了公共模块,想丰富模块,就在入口打这种“猴子补丁”

2.示例1:

import json
import ujson # pip3 install ujson

def monkey_patch_json():
    json.dump = ujson.dump
    json.dumps = ujson.dumps
    json.load = ujson.load
    json.loads = ujson.loads    

3.示例2:

class Monkey:
    def hello(self):
        print('hello')

    def world(self):
        print('world')

def other_func():
    print("from other_func")

monkey = Monkey()
monkey.hello = monkey.world
monkey.hello()  # 由原来的打印 hello==>world
monkey.world = other_func
monkey.world()  # 由原来的打印 world==>from other_func

 4.应用场景:

  • 如果我们的程序中已经基于json模块编写了大量代码了,发现有一个模块ujson比它性能更高,
    但用法一样,我们肯定不会想所有的代码都换成ujson.dumps或者ujson.loads,那我们可能会想到这么做
    import ujson as json,
    但是这么做的需要每个文件都重新导入一下,维护成本依然很高 此时我们就可以用到猴子补丁了 只需要在入口处加上: import json import ujson def monkey_patch_json(): json.__name__ = 'ujson' json.dumps = ujson.dumps json.loads = ujson.loads monkey_patch_json() # 之所以在入口处加,是因为模块在导入一次后,后续的导入便直接引用第一次的成果 #其实这种场景也比较多, 比如我们引用团队通用库里的一个模块, 又想丰富模块的功能, 除了继承之外也可以考虑用Monkey Patch.
    采用猴子补丁之后,如果发现ujson不符合预期,那也可以快速撤掉补丁。
    个人感觉Monkey Patch带了便利的同时也有搞乱源代码的风险!
    -- 摘自《林海峰博客》

     

 

参考资料

https://www.cnblogs.com/linhaifeng/articles/6384466.html#_label6

标签:monkey,Python,ujson,补丁,--,json,模块,world
From: https://www.cnblogs.com/liqi175/p/17044073.html

相关文章

  • 【题解】CF1268C K Integers
    萌新不懂就问,这是什么时代的题啊???思路trick题。首先根据trick可知:先将\([1,k]\)中的数聚在一起再排序是最优的。排序的花费是逆序对数,所以现在的问题是求把\([1,......
  • 算法入门(第二天)---双指针977,189
    977.有序数组的平方给你一个按非递减顺序排序的整数数组nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。输入:nums=[-4,-1,0,3,10]输出:[0,1,......
  • CF1768E Partial Sorting
    可能更好的阅读体验题目传送门题目翻译题目解析显然我们可以证明\(f(p)\in\{0,1,2,3\}\)\(f(p)=0\)显然只有\(s_1=1\)种。考虑\(f(p)=1\)如果前面交换一次,那么......
  • percona-toolkit运维工具
    参考MySQL基础运维——percona-toolkit运维工具_ITPUB博客一、percona-toolkit工具percona-toolkit是一组高级命令行工具的集合,用来执行各种通过手工执行非常复杂和麻烦......
  • 动态范围控制原理
    DRC介绍开门见山,动态范围的定义就是信号的最大幅值和最小幅值比值的对数(单位dB),动态范围会受到系统中各个环节的影响。例如同样是这段音乐,在一个40dB背景噪声......
  • nvm下载
    Vue报错error:0308010C:digitalenveloperoutines::unsupportednvm介绍、nvm下载安装及使用......
  • 通过ADB 禁止adroid系统升级提示
    前提:下载解压androidplatform-tools1).进入开发者选项,打开“手机打开USB调试”,“仅充电模式下允许ADB调试”,手机上确认允许电脑usb调试。2).手机上断开wifi和移动网络,......
  • 【首页】顶栏滑动跟随
    一、【首页】顶栏滑动跟随1.1顶部滑动跟随需要在scroll-view中添加scroll-into-view属性,其中代表滚动到哪个块中,匹配为子元素的id,也就是子元素需要加入id值,但是id值不可......
  • Shell要下载一个连接下的所有文件该怎么实现
    在安装某一个东西的时候,常常需要下载某个连接下的所有文件,比如:这个时候可以通过编写代码,或堆脚本来实现,但是wget这个工具可以非常巧妙的实现这个需求,wget--mirror-p......
  • maven配置文件settings.xml没生效导致报错 401 ReasonPhrase: Unauthorized
    1、查看当前mavne正在使用的setting.xmlmvnhelp:effective-settings-DshowPasswords=true2、settings.xml存在于两个地方Maven安装的地方:$M2_HOME/conf/settings.xm......