Python猴子补丁知识点总结

 更新时间:2020年01月05日 11:36:18   作者:爱喝马黛茶的安东尼  
在本篇文章里小编给大家分享的是关于Python猴子补丁知识点总结,需要的朋友们学习下。

属性在运行时的动态替换,叫做猴子补丁(Monkey Patch)。

为什么叫猴子补丁

属性的运行时替换和猴子也没什么关系,关于猴子补丁的由来网上查到两种说法:

1.这个词原来为Guerrilla Patch,杂牌军、游击队,说明这部分不是原装的,在英文里guerilla发音和gorllia(猩猩)相似,再后来就写了monkey(猴子)。

2.还有一种解释是说由于这种方式将原来的代码弄乱了(messing with it),在英文里叫monkeying about(顽皮的),所以叫做Monkey Patch。

猴子补丁的叫法有些莫名其妙,只要和“模块运行时替换的功能”对应就行了。

猴子补丁的用法

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。这个方法做一些外部查询(如查询数据库或者Web API等),类里面的很多其他方法都调用了它。然而,在一个单元测试中,你不想依赖外部数据源。所以你用哑方法态替换了这个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带了便利的同时也有搞乱源代码优雅的风险。

以上就是相关知识点总结,感谢大家的学习和对脚本之家的支持。

相关文章

  • 详解Python匹配多行文本块的正则表达式

    详解Python匹配多行文本块的正则表达式

    这篇文章主要介绍了Python 匹配多行文本块的正则表达式,该解决方案折衷了已知和未知模式的几种方法,并解释了匹配模式的工作原理,本文给大家介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • python默认参数调用方法解析

    python默认参数调用方法解析

    这篇文章主要介绍了python默认参数调用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • 一文详解NumPy数组迭代与合并

    一文详解NumPy数组迭代与合并

    NumPy 数组迭代是访问和处理数组元素的重要方法,它允许您逐个或成组地遍历数组元素,NumPy 提供了多种函数来合并数组,用于将多个数组的内容连接成一个新数组,本文给大家详细介绍了NumPy数组迭代与合并,需要的朋友可以参考下
    2024-05-05
  • OpenCV-Python实现人脸磨皮算法

    OpenCV-Python实现人脸磨皮算法

    人脸磨皮是最基础的人脸美颜效果。本文介绍了OpenCV-Python实现人脸磨皮算法,主要包括图像滤波,图像融合和图像锐化,感兴趣的可以了解一下
    2021-06-06
  • Python实现平行坐标图的绘制(plotly)方式

    Python实现平行坐标图的绘制(plotly)方式

    今天小编就为大家分享一篇Python实现平行坐标图的绘制(plotly)方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • Python中创建对象列表的实现示例

    Python中创建对象列表的实现示例

    本文主要介绍了Python中创建对象列表的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • python实现聚类算法原理

    python实现聚类算法原理

    这篇文章主要为大家详细介绍了python实现聚类算法原理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • Python开发的HTTP库requests详解

    Python开发的HTTP库requests详解

    Requests是用Python语言编写,基于urllib,采用Apache2 Licensed开源协议的HTTP库。它比urllib更加方便,可以节约我们大量的工作,完全满足HTTP测试需求。Requests的哲学是以PEP 20 的习语为中心开发的,所以它比urllib更加Pythoner。更重要的一点是它支持Python3哦!
    2017-08-08
  • Python xlwt设置excel单元格字体及格式

    Python xlwt设置excel单元格字体及格式

    这篇文章主要为大家详细介绍了Python xlwt设置excel单元格字体及格式的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • pyqt5的QWebEngineView 使用模板的方法

    pyqt5的QWebEngineView 使用模板的方法

    这篇文章主要介绍了pyqt5的QWebEngineView 使用模板的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08

最新评论