Python中的猴子补丁是什么?这篇文章给大家介绍一下猴子补丁

很多小伙伴想知道在python中,猴子补丁是什么,那么今天小编且通过这篇文章来给大家详细讲解一下什么是猴子补丁,为什么要叫猴子补丁 。感兴趣的小伙伴可以耐心阅读一下这篇文章 。

Python中的猴子补丁是什么?这篇文章给大家介绍一下猴子补丁

文章插图
猴子补丁为什么叫做猴子补丁呢?因为是属性在运行时会动态转换,这就叫做猴子补丁 。其实属性的运行替换和猴子也没什么关系,主要是网络上解释的是由于这种方式把原来的代码弄乱了,在英文里叫做monkeying about,所以就把它叫做猴子补丁了 。不得不说猴子补丁的叫法确实有点莫名其妙,但是我们只要知道和模块运行时替换的功能对应就行了 。
【Python中的猴子补丁是什么?这篇文章给大家介绍一下猴子补丁】猴子补丁的用法
(1)运行时动态替换模块的方法
stackoverflow上有两个比较热的例子,
consider a class that has a method get_data. This method does an external lookup (on a database or web API, for example), and various other methods in the class call it. However, in a unit test, you don't want to depend on the external data source - so you dynamically replace the get_data method with a stub that returns some fixed data.假设我们有一个类的方法get_data,这个方法是做外部查询的,里面也包括了很多其他的方法都调用它,不过我们在一个单元测试中,我们不想使用外部数据源,那么我们就用了哑巴方法来替换了这个方法 。
另一个例子引用了,Zope wiki上对Monkey Patch解释:
from SomeOtherProduct.SomeModule import SomeClass def speak(self):     return "ook ook eee eee eee!" SomeClass.speak = speak还有一个比较实用的例子,很多代码用到 import json,后来发现ujson性能更高,如果觉得把每个文件的import json 改成 import ujson as json成本较高,或者说想测试一下用ujson替换json是否符合预期,只需要在入口加上:
import json import ujson def monkey_patch_json():     json.__name__ = 'ujson'     json.dumps = ujson.dumps     json.loads = ujson.loads monkey_patch_json()(2)运行时动态增加模块的方法
这种场景的使用也是比较多的,例如我们运用团队通用哭里的一个模块,又想丰富模块的功能,我们除了可以用继承之外也可以使用这个monkey patch个人感觉Monkey Patch带了便利的同时也有搞乱源代码优雅的风险 。
以上就是小编给大家带来的关于猴子补丁的相关知识了,希望大家通过阅读小编的文章之后能够有所收获!如果大家觉得小编的文章不错的话,可以多多分享给有需要的人 。

    推荐阅读