您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > Python

大神写Python时,也需要猴子请来的“补丁”

时间:2022-11-01 10:46:32  来源:今日头条  作者:VT漫步

为什么叫猴子补丁?

猴子补丁的这个叫法起源于Zope框架,大家在修正Zope的Bug的时候经常在程序后面追加更新部分,这些被称作是“杂牌军补丁(guerillapatch)”,后来guerilla就渐渐的写成了gorllia(猩猩),再后来就写了monkey(猴子),所以猴子补丁的叫法是这么莫名其妙的得来的。

 

 

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

程序中对猴子补丁的解释

猴子补丁指在运行时动态改变类或模块,为的是将第三方代码打补丁在不按预期运行的bug或者feature上 。

在运行时动态修改模块、类或函数,通常是添加功能或修正缺陷。猴子补丁在代码运行时内存中发挥作用,不会修改源码,因此只对当前运行的程序实例有效。

因为猴子补丁破坏了封装,而且容易导致程序与补丁代码的实现细节紧密耦合,所以被视为临时的变通方案,不是集成代码的推荐方式。

 

代码解释

我假装有一个翻译员的模块,它能使用各种语言print出“你好”,

translator.py

class Translator:

    def __init__(self):
        pass

    def chinese(self):
        print("你好!")

    def japanese(self):
        print("空你兄哇!")

    def english(self):
        print("Hello!")

然后在另外一个文件调用这个模块,

demo.py

from translator import Translator

t = Translator()
t.japanese()
t.english()
t.chinese()

执行结果:

空你兄哇!
Hello!
你好!

然后一个广东的程序员用这个模块的时候,希望调用chinese的时候能print“雷猴”而不是“你好”。

再不改变原来模块(库)的情况下,我们可以这样给这个模块(库)打上我们需要的补丁。demo.py

from translator import Translator

t = Translator()
t.japanese()
t.english()
t.chinese()

def canton(self):
    print("雷猴!")

Translator.chinese = canton
t2 = Translator()
t2.chinese()

执行结果:

空你兄哇!
Hello!
你好!
雷猴!

猴子补丁的实际应用场景

stackoverflow上有个比较热的猴子补丁使用案例,很多代码用到 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()

猴子补丁的功能很强大,但是也带来了很多的风险,以上对json模块的修改可能会使整个Python/ target=_blank class=infotextkey>Python进程所使用的json模块都会被替换。

可能自己的代码能hold住,但是其它第三方库,有时候问题并不好排查,即使排查出来也是很棘手。



Tags:Python   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
大家好,我是皮皮。一、前言前几天在小小明大佬的Python交流群中遇到一个粉丝问了一个使用Python实现数理统计的实战问题,觉得还挺有用的,这里拿出来跟大家一起分享下。Excel数...【详细内容】
2022-11-03  Tags: Python  点击:(12)  评论:(0)  加入收藏
#安装数据库#根据数据用途选择MySQL\PostgreSQL\SQLite\MariaDB\MongoDB\clickhouse等数据库#本文以MySQL PostgreSQL 为例,其他类似。安装方法自行搜索,不在赘述。# -*- codi...【详细内容】
2022-11-01  Tags: Python  点击:(15)  评论:(0)  加入收藏
为什么叫猴子补丁?猴子补丁的这个叫法起源于Zope框架,大家在修正Zope的Bug的时候经常在程序后面追加更新部分,这些被称作是“杂牌军补丁(guerillapatch)”,后来guerilla就渐渐的...【详细内容】
2022-11-01  Tags: Python  点击:(12)  评论:(0)  加入收藏
一、前言前几天在Python钻石交流群【心田有垢生荒草】问了一个Python网络爬虫的问题,下图是截图:代码初步看上去好像没啥问题,但是结果就是不对,地图上显示的结果和网络爬虫抓到...【详细内容】
2022-10-31  Tags: Python  点击:(10)  评论:(0)  加入收藏
mport sysimport osfrom PyQt5 import QtWidgetsfrom PyQt5.QtGui import QIconimport xlrdimport datetimeimport timefrom openpyxl import Workbookfrom openpyxl.styles...【详细内容】
2022-10-26  Tags: Python  点击:(20)  评论:(0)  加入收藏
Python作为时下最热门的编程语言之一,有许多库资源。这么多资源,有哪些是程序员必备的Python库呢?老K根据了自己和身边程序员同事及朋友的经验,结合了Github上的star数据,汇总出...【详细内容】
2022-10-25  Tags: Python  点击:(23)  评论:(0)  加入收藏
参加数学建模比赛,需要明确的一点: 专业知识是一方面,不要单纯地以为把文章写好就能够拿奖; 软件的运用,文章的排版也很重要,排版美观,插图好看,讲事实摆道理通过仿真图,比如函数的拟...【详细内容】
2022-10-24  Tags: Python  点击:(8)  评论:(0)  加入收藏
来源丨网络前言在使用 Python 的早些年,为了解决 Python 包的隔离与管理 virtualenvwrapper 就成为我的工具箱中重要的一员。后来,随着 Python 3 的普及,virtualenvwrapper 逐...【详细内容】
2022-10-24  Tags: Python  点击:(6)  评论:(0)  加入收藏
案例需求:定义一个数字(1~10,随机产生),通过3次判断来猜出来数字 案例要求: 1.数字随机产生,范围1-10 2.有3次机会猜测数字,通过3层嵌套判断实现 3.每次猜不中,会提示大了或小了...【详细内容】
2022-10-24  Tags: Python  点击:(12)  评论:(0)  加入收藏
用python画不断增大的渐变色片状立体图形,源码解释如下:import turtle as t 调用turtle库import colorsys 调用颜色t.bgcolor("black") 设置背景颜色t.tracer(100) 设置追踪频...【详细内容】
2022-10-24  Tags: Python  点击:(17)  评论:(0)  加入收藏
▌简易百科推荐
大家好,我是皮皮。一、前言前几天在小小明大佬的Python交流群中遇到一个粉丝问了一个使用Python实现数理统计的实战问题,觉得还挺有用的,这里拿出来跟大家一起分享下。Excel数...【详细内容】
2022-11-03  Python进阶学习交流  今日头条  Tags:Python   点击:(12)  评论:(0)  加入收藏
#安装数据库#根据数据用途选择MySQL\PostgreSQL\SQLite\MariaDB\MongoDB\clickhouse等数据库#本文以MySQL PostgreSQL 为例,其他类似。安装方法自行搜索,不在赘述。# -*- codi...【详细内容】
2022-11-01  Pgabc    Tags:Python   点击:(15)  评论:(0)  加入收藏
为什么叫猴子补丁?猴子补丁的这个叫法起源于Zope框架,大家在修正Zope的Bug的时候经常在程序后面追加更新部分,这些被称作是“杂牌军补丁(guerillapatch)”,后来guerilla就渐渐的...【详细内容】
2022-11-01  VT漫步  今日头条  Tags:Python   点击:(12)  评论:(0)  加入收藏
一、前言前几天在Python钻石交流群【心田有垢生荒草】问了一个Python网络爬虫的问题,下图是截图:代码初步看上去好像没啥问题,但是结果就是不对,地图上显示的结果和网络爬虫抓到...【详细内容】
2022-10-31  Python进阶者    Tags:Python   点击:(10)  评论:(0)  加入收藏
mport sysimport osfrom PyQt5 import QtWidgetsfrom PyQt5.QtGui import QIconimport xlrdimport datetimeimport timefrom openpyxl import Workbookfrom openpyxl.styles...【详细内容】
2022-10-26  张先生870707  今日头条  Tags:Python   点击:(20)  评论:(0)  加入收藏
学习目标 了解分类器的任务和数据样式 掌握如何用Pytorch实现一个分类器分类器任务和数据介绍 构造一个将不同图像进行分类的神经网络分类器, 对输入的图片进行判别并完成分...【详细内容】
2022-10-25  传智教育官方账号  今日头条  Tags:Pytorch实   点击:(13)  评论:(0)  加入收藏
Python作为时下最热门的编程语言之一,有许多库资源。这么多资源,有哪些是程序员必备的Python库呢?老K根据了自己和身边程序员同事及朋友的经验,结合了Github上的star数据,汇总出...【详细内容】
2022-10-25  老K玩代码  今日头条  Tags:Python库   点击:(23)  评论:(0)  加入收藏
参加数学建模比赛,需要明确的一点: 专业知识是一方面,不要单纯地以为把文章写好就能够拿奖; 软件的运用,文章的排版也很重要,排版美观,插图好看,讲事实摆道理通过仿真图,比如函数的拟...【详细内容】
2022-10-24  思铺学院    Tags:数学建模   点击:(8)  评论:(0)  加入收藏
案例需求:定义一个数字(1~10,随机产生),通过3次判断来猜出来数字 案例要求: 1.数字随机产生,范围1-10 2.有3次机会猜测数字,通过3层嵌套判断实现 3.每次猜不中,会提示大了或小了...【详细内容】
2022-10-24  念兮暮霞如烟    Tags:python   点击:(12)  评论:(0)  加入收藏
用python画不断增大的渐变色片状立体图形,源码解释如下:import turtle as t 调用turtle库import colorsys 调用颜色t.bgcolor("black") 设置背景颜色t.tracer(100) 设置追踪频...【详细内容】
2022-10-24   嘻呱嘻呱大又圆     Tags:python   点击:(17)  评论:(0)  加入收藏
站内最新
站内热门
站内头条