前言本次依然是选自python面试题系列,将一个比较偏的概念,可能很多人没怎么听说过——猴子补丁,其实所讲的内容很简单,它得益于python灵活的语法、一切皆对象的思想,一起来看看看看吧!目录一、什么是monkey patch

二、monkey patch的功能简介

2.1 运行时动态改变类的方法

2.2 monkey patch的应用场景

一、什么是monkey patch

为什么叫猴子补丁?这其实是一个很难回答的问题,似乎和Python语言没啥关系,而且也和它所实现的功能扯不上什么关系,但是偏偏就这么叫了,那就姑且这么称呼吧。

关于猴子补丁的由来网上查到两种说法:1,这个词原来为Guerrilla Patch,杂牌军、游击队,说明这部分不是原装的,在英文里guerilla发音和gorllia(猩猩)相似,再后来就写了monkey(猴子)。

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

外国人有时候总是会给一些概念莫名其妙的称呼,这就不管他了,关键是理解它的本质和功能才是最重要的。

先明确一个观点:猴子补丁(monkey patch)的主要功能就是动态的属性的替换。虽然属性的运行时替换和猴子也没什么关系,所以说猴子补丁的叫法有些莫名其妙,但是只要和“模块运行时替换的功能”对应就行了。

二、monkey patch的功能简介

monkey patch允许在运行期间动态修改一个类或模块(注意python中一切皆对象,包括类、方法、甚至是模块)

2.1 运行时动态改变类的方法

先看一个简单的例子:class A:

def func(self):

print('Hi')

def monkey(self):

print('Hi, monkey')

a = A()

a.func()

'''运行结果

Hi

'''

上面的结果无可厚非,大家都知道,但是看一下下面的例子:class A:

def func(self):

print('Hi')

def monkey(self):

print('Hi, monkey')

a = A()

A.func=A.monkey   #在运行的时候,才改变了func

a.func()

'''运行结果

Hi, monkey

'''

就这么简单,其实这根本的原因在于Python语法的灵活性,方法可以像普通对象那样使用。

我们还可以这样做:class A:

def func(self):

print('Hi')

def monkey(self):

print('Hi, monkey')

def outer_monkey(a):  # a 这个参数是没有用到的,因为func有一个参数,如果这个函数没有参数的话不能这样直接赋值

print('Hi,outer monkey')

a = A()

A.func=outer_monkey

a.func()

'''运行结果

Hi, outer monkey

'''

将类外面的普通方法依然可以在程序运行的时候动态赋值给类的某一个方法。

总结:上面所展示的其实就是monkey patch,即运行时动态改变方法、类的方法。其实不管是定义在类外的普通方法、类里面的方法、甚至是模块这些都可以进行“动态替换的操作”,不得不感叹python真的是一门简洁灵活的语言。

2.2 monkey patch的应用场景

这里有一个比较实用的例子,很多代码用到 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()

其实这种场景也比较多,比如我们引用团队通用库里的一个模块,又想丰富模块的功能,除了继承之外也可以考虑用Monkey Patch。个人感觉Monkey Patch带了便利的同时也有搞乱源代码优雅的风险。猜您喜欢

python 猴子补丁_python面试题精讲——monkey patch(猴子补丁)相关推荐

  1. 第三百三十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—深度优先与广度优先原理...

    第三百三十八节,Python分布式爬虫打造搜索引擎Scrapy精讲-深度优先与广度优先原理 网站树形结构 深度优先 是从左到右深度进行爬取的,以深度为准则从左到右的执行(递归方式实现)Scrapy默认 ...

  2. 第三百六十二节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)基本的索引和文档CRUD操作、增、删、改、查...

    第三百六十二节,Python分布式爬虫打造搜索引擎Scrapy精讲-elasticsearch(搜索引擎)基本的索引和文档CRUD操作.增.删.改.查 elasticsearch(搜索引擎)基本的索引 ...

  3. 三十七 Python分布式爬虫打造搜索引擎Scrapy精讲—将bloomfilter(布隆过滤器)集成到scrapy-redis中...

    Python分布式爬虫打造搜索引擎Scrapy精讲-将bloomfilter(布隆过滤器)集成到scrapy-redis中,判断URL是否重复 布隆过滤器(Bloom Filter)详解 基本概念 如 ...

  4. 第三百六十节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本概念...

    第三百六十节,Python分布式爬虫打造搜索引擎Scrapy精讲-elasticsearch(搜索引擎)的基本概念 elasticsearch的基本概念 1.集群:一个或者多个节点组织在一起 2.节点 ...

  5. Python机器学习全流程项目实战精讲(2018版)

    Python机器学习全流程项目实战精讲(2018版) 网盘地址:https://pan.baidu.com/s/16SSVq74YC07M0dW1iDekPg 提取码: vu7r 备用地址(腾讯微云) ...

  6. 第三百四十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—爬虫和反爬的对抗过程以及策略—scrapy架构源码分析图...

    第三百四十五节,Python分布式爬虫打造搜索引擎Scrapy精讲-爬虫和反爬的对抗过程以及策略-scrapy架构源码分析图 1.基本概念 2.反爬虫的目的 3.爬虫和反爬的对抗过程以及策略 scra ...

  7. 学习python-day02-25---转自Python分布式爬虫打造搜索引擎Scrapy精讲

    第三百六十九节,Python分布式爬虫打造搜索引擎Scrapy精讲-elasticsearch(搜索引擎)用Django实现搜索功能 Django实现搜索功能 1.在Django配置搜索结果页的路由映 ...

  8. 高薪程序员面试题精讲系列152之电商专题(中)-SPU是怎么回事?SPU如何设计?SKU又是什么呢?SN你知道吗?

    一. 面试题及剖析 1. 今日面试题 你做过电商项目吗? SKU怎么设计? SPU如何设计实现? 2. 题目剖析 在前两篇文章中,壹哥给大家介绍了电商相关的一些背景知识,以及购物车的业务实现.如果你还 ...

  9. 高薪程序员面试题精讲系列72之死锁产生的原因及解决办法,如何定位死锁产生的位置?

    一. 面试题及剖析 1. 今日面试题 如何保证线程的安全? 如何保证线程的有序性? 线程死锁是怎么产生的? 如何解决线程死锁? 如果生产环境的项目产生了死锁如何定位? 2. 题目剖析 在前两篇文章中, ...

最新文章

  1. JVM经常使用的调优參数
  2. python3华丽gui_Python3.7 - tkinter Gui 03 Options的用法
  3. 在Windows 下使用OpenCL
  4. 实验linux下的编程,实验四 Linux下的C语言编程;
  5. python 数据结构包括三方面_python数据结构
  6. 实现Windows Embedded 8 Standard 上的快速开机(HORM)
  7. Android Editable
  8. Flutter之RenderObjectWidget
  9. 亲测有效!12306火车票买下铺方法(2016.12.30)
  10. 微信百度网盘小程序文件分享Burp抓包获得链接和提取码
  11. setpositivebutton
  12. Echarts legend组件 图例默认选中状态
  13. frps port unavailable
  14. 成都聚华祥科技:标题的关键词组合技巧
  15. ApplicationAware
  16. 全球及中国游戏方向盘行业营销动态及销售渠道研究报告(2022-2027)
  17. Markdown的语法使用
  18. 除了年夜饭,这些举动能够让老人暖心
  19. A 经此一役小红所向无敌(水题)
  20. linux终端关闭xmanager,关于使用Xmanager进行对linux远程桌面控制

热门文章

  1. Python timedelta total_seconds()方法与示例
  2. puppeteer api_使用Node.js和puppeteer API从URL创建PDF文件
  3. 物联网计算机相关专业吗,物联网工程属于计算机专业吗
  4. 开篇词:如何轻松获得 Offer
  5. Golang类型转换
  6. UNDO Tablespace
  7. C++总结篇(5)vector
  8. python爬虫lxml xpath测试
  9. JQuery Datatables 在Bootstrap tab中列名无法对齐的问题
  10. flex java oracle_Flex使用Blazeds与Java交互及自定义对象转换详解-DATAGRID读取ORACLE数据...