| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Python知识库 -> Python中的Monkey Patch(猴子补丁) -> 正文阅读 |
|
[Python知识库]Python中的Monkey Patch(猴子补丁) |
一、猴子补丁的介绍关于猴子补丁为啥叫猴子补丁,据说是这样子的:
Monkey Patch的翻译叫“程序运行过程中的补丁”? 二、什么时候用到如果都是自己写的代码,Monkey Patch 就毫无意义了,直接改源码就可以。Monkey Patch 的主要用途,在于源码不宜直接修改。比如你要修正一个第三方 module 的 bug 或者进行特定的修正、扩展,通常来说有下面几种做法: 1.直接把源?package/module,复制一份到当前项目中,再改源码;但不推荐,因为会导致当前的项目代码管理上的混乱。 2.向源作者提 pull request,以修正 bug 或者其他;应该如此,但未必能联系到对方,联系到了对方未必修改,修改了未必很快能用上。 这个时候 Monkey Patch 的价值就出来了,不用改原始的 module 源码,就能达到自己期望的效果。 三、如何打补丁当前Python版本为3.8.3,以下为打补丁的简单示例:
执行上述代码,输出结果为:
再看另外一个案例:例如当前有一个类Foo,我们想使用json对该类的实例化对象foo进行序列化
?执行上述代码,其输出结果为:
从上述结果中可以看到Python自带的json包不支持自定义对象转json串,在Python中用json.dumps转自定义对象时会报异常class?is?not?JSON?serializable。这个时候我们可以通过增加一段补丁代码(猴子补丁)便可实现自定义转换,首先创建一个名为make_json_serializable.py的文件,里面的补丁内容如下:
通过补丁代码我们可以看到,代码替换了json包的默认转json的方法,运行了补丁代码后,转json的过程变成了先找对象的to_json属性,在没有to_json属性的情况下才使用默认的JSONEncoder.default的方法,也就是通过这么一个patch,增加了json包原来没有的功能。? 在另外一个xxx.py文件中导入make_json_serializable,然后再使用json进行序列化:
输出结果:
总结:实际使用猴子补丁时,一般会把需要 patch(打补丁)?的逻辑,放在一个或多个(归属同一个模块文件夹)? 四、猴子补丁的用处1.在运行时替换方法、属性等 例如:上面自定义对象转json,在原有json包不满足的条件下,只需要将以上的一个patch写在一个文件里自己再import一次,便可实现自己想要的功能,这是非常方便的。 猴子补丁的主要功能便是在不去改变源码的情况下而对功能进行追加和变更,对于编程过程中使用一些第三方不满足需求的情况下,使用猴子补丁是非常方便的。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/15 21:28:06- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |