什么是水猴子是什么补丁

博客分类:
何谓猴子补丁(Monkey Patch)?在动态语言中,不修改源代码而对功能进行追加和变更。
使用猴子补丁的目的:
1、追加功能
2、功能变更
3、修正程序错误
4、增加钩子,在执行某个方法的同时执行一些其他的处理,如打印日志,实现AOP等,
5、缓存,在计算量很大,结算之后的结果可以反复使用的情况下,在一次计算完成之后,对方法进行替换可以提高处理速度。
Ruby的类都是开放类,即在类定义之后还可以任意添加内容, 这就使得在Ruby中使用猴子补丁变得特别容易了。另外,Ruby还提供了对方法、类和模块的进行操作的功能,让我们使用猴子补丁更加得心应手。Ruby提供的基本功能如下:
&&&&& alias:给方法另起别名
&&&&& include:引入其他模块的方法
&&&&& remove_method: 取消本类中的方法
&&&&& undef:取消方法
例子:
alias:class Monkey2 & Monkey
def method2
puts "This is method2"
alias output method2
monkey = Monkey2.new
monkey.method2
monkey.output
include:module Helper
puts "Help..."
def method1
puts "helper method1..."
class Monkey
include Helper
def method1
puts "monkey method1..."
monkey = Monkey.new
monkey.help
monkey.method1#因为重名,当前类的方法优先
undef:class Monkey
def method1
puts "This is method1"
class Monkey2 & Monkey
def method2
puts "This is method2"
monkey = Monkey2.new
monkey.method1
monkey.method2
class Monkey2
undef method1
undef method2
monkey.method1
monkey.method2
我们还可以使用undef_method或者remove_method实现undef &method_name&同样的功能,例子如下: class Monkey2
remove_method :method1
undef_method :method2
猴子补丁是一个非常诱人的功能,尤其是在java的那个改个标点符号都要重新编译、打包的世界。因此,老衲内心十分的喜欢,分享给大家,但是剑有双刃,如若使用不当,也会伤着自己。因此在使用猴子补丁的时候,还应注意如下事项:
1、基本上只追加功能
2、进行功能变更时要谨慎,尽可能的小规模
3、注意相互调用
ningandjin
浏览: 831181 次
来自: 成都
请问注解@ApiModelProperty 在哪个jar包下面 ...
这东东真的好用么/
http://git.oschina.net/zzq0324/ ...
你好,我在maven上面下载了swagger-springmv ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'《DNF补丁》红毛猴子宠物改光头强熊二
导读《DNF补丁》红毛猴子宠物改光头强熊二
  《》红毛猴子宠物改光头强熊二
您可以使用“← | →”键快速翻页,或者进入模式!
(文章作者:暴走小土豆)
?&?&?&?&?&?&?&?&?&?&
&&(0)&&(0)&&(0)
&&(0)&&(4)&&(4)&&(4)&&(0)&&(0)&&(0)&&(0)&&(0)&&(0)python基础(9)
monkey patch指的是在运行时动态替换,一般是在startup的时候.
用过gevent就会知道,会在最开头的地方gevent.monkey.patch_all();把标准库中的thread/socket等给替换掉.这样我们在后面使用socket的时候可以跟平常一样使用,无需修改任何代码,但是它变成非阻塞的了.
之前做的一个游戏服务器,很多地方用的import json,后来发现ujson比自带json快了N倍,于是问题来了,难道几十个文件要一个个把import json改成import ujson as json吗?
其实只需要在进程startup的地方monkey patch就行了.是影响整个进程空间的.
同一进程空间中一个module只会被运行一次.
下面是代码.
import json
import ujson
def monkey_patch_json():
json.__name__ = 'ujson'
json.loads = ujson.loads
print 'main.py',json.__name__import sub
import jsonprint 'sub.py',json.__name__属性在运行时的动态替换,叫做猴子补丁(Monkey Patch)。
为什么叫猴子补丁
属性的运行时替换和猴子也没什么关系,关于猴子补丁的由来网上查到两种说法:
1,这个词原来为Guerrilla Patch,杂牌军、游击队,说明这部分不是原装的,在英文里guerilla发音和gorllia(猩猩)相似,再后来就写了monkey(猴子)。
2,还有一种解释是说由于这种方式将原来的代码弄乱了(messing with it),在英文里叫monkeying about(顽皮的),所以叫做Monkey Patch。
猴子补丁的叫法有些莫名其妙,只要和“模块运行时替换的功能”对应就行了。
Monkey patch就是在运行时对已有的代码进行修改,达到hot patch的目的。Eventlet中大量使用了该技巧,以替换标准库中的组件,比如socket。
首先来看一下最简单的monkey patch的实现。
1class Foo(object):2
def bar(self):3
print('Foo.bar')45def bar(self):6
print('Modified bar')78Foo().bar()9Foo.bar = bar10Foo().bar()11121314由于Python中的名字空间是开放,通过dict来实现,所以很容易就可以达到patch的目的。1,运行时动态替换模块的方法stackoverflow上有两个比较热的例子,
consider a class that has a method get_data.
This method does an external lookup (on a database or web API, for example),
and various other methods in the class call it. However, in a unit test,
you don't want to depend on the external data source - so you dynamically replace the get_data method with a stub that returns some fixed data.
假设一个类有一个方法get_data。这个方法做一些外部查询(如查询数据库或者Web API等),
类里面的很多其他方法都调用了它。
然而,在一个单元测试中,你不想依赖外部数据源。所以你用哑方法态替换了这个get_data方法,
哑方法只返回一些测试数据。
另一个例子引用了,Zope wiki上对Monkey Patch解释:
from SomeOtherProduct.SomeModule import SomeClass
def speak(self):
return "ook ook eee eee eee!"
SomeClass.speak = speak
还有一个比较实用的例子,很多代码用到 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()
2,运行时动态增加模块的方法
这种场景也比较多,比如我们引用团队通用库里的一个模块,又想丰富模块的功能,除了继承之外也可以考虑用Monkey Patch。
个人感觉Monkey Patch带了便利的同时也有搞乱源代码优雅的风险。&nbsp>&nbsp
&nbsp>&nbsp
&nbsp>&nbsp
什么是猴子补丁(monkey patch)
摘要:monkeypatch指的是在运行时动态替换,一般是在startup的时候.用过gevent就会知道,会在最开头的地方gevent.monkey.patch_all();把标准库中的thread/socket等给替换掉.这样我们在后面使用socket的时候可以跟平常一样使用,无需修改任何代码,但是它变成非阻塞的了.之前做的一个游戏服务器,很多地方用的importjson,后来发现ujson比自带json快了N倍,于是问题来了,难道几十个文件要一个个把importjson改成i
monkey patch指的是在运行时动态替换,一般是在startup的时候.
用过gevent就会知道,会在最开头的地方gevent.monkey.patch_all();把标准库中的thread/socket等给替换掉.这样我们在后面使用socket的时候可以跟平常一样使用,无需修改任何代码,但是它变成非阻塞的了.
之前做的一个游戏服务器,很多地方用的import json,后来发现ujson比自带json快了N倍,于是问题来了,难道几十个文件要一个个把import json改成import ujson as json吗?
其实只需要在进程startup的地方monkey patch就行了.是影响整个进程空间的.
同一进程空间中一个module只会被运行一次.
下面是代码.
main.py import jsonimport ujsondef monkey_patch_json(): json.__name__ = 'ujson' json.dumps = ujson.dumps json.loads = ujson.loadsmonkey_patch_json()print 'main.py',json.__name__import sub
sub.py import jsonprint 'sub.py',json.__name__
运行main.py,可以看到都是输出'ujson',说明后面import的json是被patch了的.
最后,注意不能单纯的json = ujson来替换.
以上是的内容,更多
的内容,请您使用右上方搜索功能获取相关信息。
若你要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内给你回复。
云服务器 ECS
可弹性伸缩、安全稳定、简单易用
&40.8元/月起
预测未发生的攻击
&24元/月起
为您提供0门槛上云实践机会
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供
什么是猴子补丁(monkey patch)相关信息,包括
的信息,所有什么是猴子补丁(monkey patch)相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
服务与支持
账号与支持
关注阿里云
International

我要回帖

更多关于 gevent 猴子补丁 的文章

 

随机推荐