什么是猴子补丁(monkey patch)?

2021年2月23日 / 146次阅读 / Last Modified 2021年2月23日

Python实在是太灵活了,由于都是对象,都是对象的reference,在修改代码的时候,出现了一种monkey patch的思路。

这个思路是:不改变核心代码本身,而是在运行时通过修改引用的指向,来达到修改运行代码的效果。

class A:
    def func(self):
        print("Hi")
    def monkey(self):
        print("Hi, monkey")
a = A()
A.func=A.monkey   #在运行的时候,才改变了func
a.func()
'''运行结果
Hi, monkey
'''

加入func是核心代码,因为各种原因还不能直接修改,于是我们定义一个monkey函数,在运行时,改变func的指向。运行func的时候,实际上运行的就是monkey。

以上示例monkey函数是一个class method,也可以用一个外部独立的函数,不过这个函数需要有一个参数,因为func是class method,有一个self参数。

monkey patch名称的由来?

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

1,这个词原来为Guerrilla Patch,杂牌军、游击队,说明这部分不是原装的,在英文里guerilla发音和gorllia(猩猩)相似,再后来就写了monkey(猴子)。
2,还有一种解释是说由于这种方式将原来的代码弄乱了(messing with it),在英文里叫monkeying about(顽皮的),所以叫做Monkey Patch。

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

  • Monkey patch就是在运行时对已有的代码进行修改。
  • Eventlet中大量使用了该技巧,以替换标准库中的组件,比如socket。

Python太灵活了,猴子补丁,鸭子类型

-- EOF --

本文链接:https://www.pynote.net/archives/3547

相关文章

    留言区

    《什么是猴子补丁(monkey patch)?》有1条留言

    您的电子邮箱地址不会被公开。 必填项已用*标注

    • 麦新杰

      为了将 python 标准库改造成支持 gevent 的非阻塞库,gevent 使用了 monkey_patch(俗称“猴子补丁”)的办法对大部分标准库包括 socket、ssl、threading 和 select 等模块做了改写。所谓“猴子补丁”就是不改变源代码而对功能进行追加和变更,所以“猴子补丁”并不是 Python 中专有的,一方面它充分利用了动态语言的灵活性,可以对现有的语言 Api 进行追加,替换,修改 Bug,甚至性能优化等,另一方面也给系统维护带来了一些风险。 [回复]


    前一篇:
    后一篇:

    More


    ©Copyright 麦新杰 Since 2019 Python笔记

    go to top