专栏首页机器学习与python集中营python面试题精讲——monkey patch(猴子补丁)

python面试题精讲——monkey patch(猴子补丁)

前言

本次依然是选自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集中营(yasuozet01),作者:草yang年华

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 说说Python中猴子补丁是什么?

    小猿会从最基础的面试题开始,每天一题。如果参考答案不够好,或者有错误的话,麻烦大家可以在留言区给出自己的意见和讨论,大家是要一起学习的 。

    程序IT圈
  • 昨天去面试,这5个Python面试题都被考到了,Python面试题No6

    这个考点考了python的解压赋值的知识点,即 a,b,c,middle,d,e,f = list, middle = [1,2,3,4,5]。

    梦想橡皮擦
  • Python猴子补丁Monkey Patch用法实例解析

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

    砸漏
  • python笔记69 - 什么是猴子补丁(Monkey Patch)?

    python里面什么是猴子补丁(Monkey Patch)?,使用场景有哪些? 猴子补丁主要有以下几个用处:

    上海-悠悠
  • 什么是猴子补丁?

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

    宇宙之一粟
  • How to Save an ARIMA Time Series Forecasting Model in Python (如何在Python中保存ARIMA时间序列预测模型)

    How to Save an ARIMA Time Series Forecasting Model in Python 原文作者:Jason Brownlee...

    Steve Wang
  • 如何在Python中保存ARIMA时间序列预测模型

    原文地址:https://machinelearningmastery.com/save-arima-time-series-forecasting-model...

    Steve Wang
  • 如何在Python中保存ARIMA时间序列预测模型

    自回归移动平均模型(ARIMA)是一种常用于时间序列分析和预测的线性模型。 statsmodels库提供了Python中使用ARIMA的实现。ARIMA模型可以...

    AiTechYun
  • Python 协程检测Kubernetes服务端口

    https://www.cnblogs.com/xiao987334176/p/10237551.html

    py3study
  • Python面试必刷题系列(5)

    结论:只有数值型和字符串型比较,a is X才为True,当是tuple,list,dict或set型时,a is X为False。

    小萌哥
  • 在 Go 语言中使用猴子补丁

    很多人认为猴子补丁(A monkey patch is a way for a program to extend or modify supporting s...

    李海彬
  • Python 并发网络库

    希希里之海
  • Golang 测试教程

    谢伟
  • 你知道什么是Python里的鸭子类型和猴子补丁吗?

    有时候我们会听到Python里所谓的鸭子类型和猴子补丁的说法,乍一听还以为是来到了动物园,Python这只大蟒蛇还可以和鸭子和猴子一起玩耍?

    石晓文
  • Python与协程从Python2—Python3

    协程,又称微线程、纤程,英文名Coroutine;用一句话说明什么是线程的话:协程是一种用户态的轻量级线程。

    嘉为蓝鲸
  • [1] tips

    before_requrst 多个 从上往下 process_request

    不学就是不会
  • python中*args 和 **kwargs 的用法学习笔记

    *args 和 **kwargs 主要用于函数定义。 你可以将不定数量的参数传递给一个函数。

    用户7886150
  • Python并发编程协程(Coroutine)之Gevent

    Gevent官网文档地址:http://www.gevent.org/contents.html 基本概念 我们通常所说的协程Coroutine其实是corpo...

    coders
  • Python面试题(01)

    这个周末没有更新粉丝还有增长挺开心的,感谢大家的支持。在学习python的时候看了很多面试题,以巩固自己学过的知识,自己会整理一下分享给大家,今天的十个题算是以...

    PM小王

扫码关注云+社区

领取腾讯云代金券