2021年2月23日 / 759次阅读 / 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。
猴子补丁的叫法有些莫名其妙,只要和“模块运行时替换的功能”对应就行了。
Python太灵活了,猴子补丁,鸭子类型!
-- EOF --
本文链接:https://www.pynote.net/archives/3547
《什么是猴子补丁(monkey patch)?》有1条留言
前一篇:再说generator生成器
后一篇:a is b,但 a == b不成立
Ctrl+D 收藏本页
©Copyright 麦新杰 Since 2019 Python笔记
为了将 python 标准库改造成支持 gevent 的非阻塞库,gevent 使用了 monkey_patch(俗称“猴子补丁”)的办法对大部分标准库包括 socket、ssl、threading 和 select 等模块做了改写。所谓“猴子补丁”就是不改变源代码而对功能进行追加和变更,所以“猴子补丁”并不是 Python 中专有的,一方面它充分利用了动态语言的灵活性,可以对现有的语言 Api 进行追加,替换,修改 Bug,甚至性能优化等,另一方面也给系统维护带来了一些风险。 [ ]