Python中的猴子补丁是什么

Python中的猴子补丁是什么

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

为什么叫猴子补丁

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

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

立即学习“Python免费学习笔记(深入)”;

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

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

猴子补丁的用法

1、运行时动态替换模块的方法

stackoverflow上有两个比较热的例子,

consider a class that has a method get_data. This method does anexternal lookup (on a database or web API, for example), and variousother methods in the class call it. However, in a unit test, you don'twant to depend on the external data source - so you dynamicallyreplace 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 SomeClassdef speak(self):    return "ook ook eee eee eee!"SomeClass.speak = speak

登录后复制

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

import jsonimport ujsondef monkey_patch_json():    json.__name__ = 'ujson'    json.dumps = ujson.dumps    json.loads = ujson.loadsmonkey_patch_json()

登录后复制

2、运行时动态增加模块的方法

这种场景也比较多,比如我们引用团队通用库里的一个模块,又想丰富模块的功能,除了继承之外也可以考虑用Monkey Patch。

个人感觉Monkey Patch带了便利的同时也有搞乱源代码优雅的风险。

PHP中文网,有大量免费的Python视频教程,欢迎大家学习!

本文转自:https://www.jianshu.com/p/a19f936471e4

以上就是Python中的猴子补丁是什么的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2250215.html

(0)
上一篇 2025年2月26日 23:48:51
下一篇 2025年2月23日 13:14:15

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • python的两种编程方式是什么

    一、交互式编程 什么是交互式编程,就是在命令行中输入python 命令即可启动交互式编程,提示窗口如下: 而且还用了Python3的print方法打印出一串字符串。 立即学习“Python免费学习笔记(深入)”; 二、脚本式编程 通过脚本参…

    2025年2月26日 编程技术
    200
  • python标识符命名规范是什么

    简单地理解,标识符就是一个名字,就好像我们每个人都有属于自己的名字,它的主要作用就是作为变量、函数、类、模块以及其他对象的名称。 Python 中标识符的命名不是随意的,而是要遵守一定的命令规则,比如说: 1.标识符是由字符(A~Z 和 a…

    2025年2月26日
    200
  • python时间戳转换日期格式的方法是什么

    日期和时间的相互转换可以利用Python内置模块time和datetime完成,且有多种方法供我们选择,当然转换时我们可以直接利用当前时间或指定的字符串格式的时间格式。 获取当前时间转换 我们可以利用内置模块datetime获取当前时间,然…

    2025年2月26日
    200
  • python安装扩展库常用的是什么工具

    pip 是 Python 包管理工具,该工具提供了对Python 包的查找、下载、安装、卸载的功能。 目前如果你在 python.org 下载最新版本的安装包,则是已经自带了该工具。 Python 2.7.9 + 或 Python 3.4+…

    2025年2月26日
    200
  • python如何创建空列表

    在Python中创建新的空列表的方法有两种,如下: l = [] 登录后复制 或 l = list() 登录后复制 list()比[]慢,因为: 1、有符号查找; 立即学习“Python免费学习笔记(深入)”; 2、有函数调用; 3、然后,…

    2025年2月26日
    200
  • python中列表的用法是什么

    列表(list)是最常用的Python数据类型,它可以作为一个方括号内的逗号分割值出现。 List中的数据项不需要具有相同的类型,可以进行的操作包括索引(第一个索引是0,第二个索引是1,以此类推)、切片、加、乘、检查成员等。 创建一个列表,…

    2025年2月26日 编程技术
    200
  • python中insert用法是什么

    描述 insert() 函数用于将指定对象插入列表的指定位置。 语法 insert()方法语法: 立即学习“Python免费学习笔记(深入)”; list.insert(index, obj) 登录后复制 参数 index — …

    2025年2月26日
    200
  • python ipo模型是指什么

    IPO(Input Processing Output)模式,即输入数据→处理数据→输出结果。例如: # month.pymonths=”JanFebMarAprMayJunJulAugSepOctNovDec”n=input(“请输入月份…

    2025年2月26日
    200
  • python中complex是什么意思

    complex() 函数用于创建一个值为 real + imag * j 的复数或者转化一个字符串或数为复数。如果第一个参数为字符串,则不需要指定第二个参数。(推荐:Python编程视频) 语法 complex 语法: class comp…

    2025年2月26日
    200
  • python的五个特点

    python是一种解释性、交互式、面向对象的跨平的语言。近年来,热持续上涨,人才需求量也祝年攀升,备受程序员的追捧。 那么python语言的特点有哪些呢?                             (推荐学习:Python视频…

    2025年2月26日
    200

发表回复

登录后才能评论