Ruby使用Monkey Patch猴子补丁方式进行程序开发的示例
猴子补丁(Monkey Patch)是一种特殊的编程技巧。Monkey patch 可以用来在运行时动态地修改(扩展)类或模块。我们可以通过添加 Monkey Patch 来修改不满足自己需求的第三方库,也可以添加 Monkey Patch 零时修改代码中的错误。
词源
Monkey patch 最早被称作 Guerrilla patch,形容这种补丁像游击队员一样狡猾。后来因为发音相似,被称为 Gorilla patch。因为大猩猩不够可爱,后改称为 Monkey patch。
使用场景
以我的理解,Monkey patch 有两种使用场景:
紧急的安全性补丁,即 Hotfix;
修改或扩展库中的属性和方法。
例子:
alias:
class Monkey2 < Monkey def method2 puts "This is method2" end alias output method2 end monkey = Monkey2.new monkey.method2 monkey.output
include:
module Helper def help puts "Help..." end def method1 puts "helper method1..." end end class Monkey include Helper def method1 puts "monkey method1..." end end monkey = Monkey.new monkey.help monkey.method1#因为重名,当前类的方法优先
undef:
class Monkey def method1 puts "This is method1" end end class Monkey2 < Monkey def method2 puts "This is method2" end end monkey = Monkey2.new monkey.method1 monkey.method2 class Monkey2 undef method1 undef method2 end monkey.method1 monkey.method2
我们还可以使用undef_method或者remove_method实现undef <method_name>同样的功能,例子如下:
class Monkey2 remove_method :method1 undef_method :method2 nd
在使用猴子补丁的时候,还应注意如下事项:
1、基本上只追加功能
2、进行功能变更时要谨慎,尽可能的小规模
3、注意相互调用
相关推荐
-
Android自动测试工具Monkey
前言: 最近开始研究Android自动化测试方法,对其中的一些工具.方法和框架做了一些简单的整理,其中包括android测试框架.CTS.Monkey.Monkeyrunner.benchmark.其它test tool等等.因接触时间很短,很多地方有不足之处,希望能和大家多多交流. 一.Monkey定义 探索软件测试工具有哪些,本文主要介绍Monkey工具.Monkey测试是Android平台自动化测试的一种手段,通过Monkey程序模拟用户触摸屏幕.滑动.按键等操作来对设备上的程序进行压力测
-
Android自动测试工具Monkey的实现方法
1. Android Monkey 实现操作流程: 准备:在eclipse里安装Phyon插件,可以选择在线安装,也可以下载zip解压后放在eclipse安装目录的dropins下,如 : /personal/software/android_developtools/adt-bundle-mac-x86_64-20130522/eclipse/dropins/PyDev 2.8.2 插件准备就绪就重启eclipse,检验PyDev是否正常工作,然后开始MonkeyRunner测试: 第一步:
-
用Greasemonkey 脚本收藏网站会员信息到本地
一.脚本功能介绍 正常情况下,如果你在会员搜索结果页通过相片看好某个会员(所谓眼缘好的会员),想快速记录下这个会员的信息并不是一件容易的事情,你也许会在会员相片上单击右键,然后把这个会员的主页地址先记下来,一个页面如果有较多看好的会员想收藏的话,你还得重复上面的操作.默认搜索结果页显示效果如下图: 安装我写的Greasemonkey脚本后,搜索结果页就会发生一点改变,"给我写信"按钮会变成"收藏"复选框,效果如下图,注意红框标识与前面图片的变化对比: 现在假设你想收
-
android压力测试命令monkey详解
一.Monkey 是什么?Monkey 就是SDK中附带的一个工具. 二.Monkey 测试的目的?:该工具用于进行压力测试. 然后开发人员结合monkey 打印的日志 和系统打印的日志,结局测试中出现的问题. 三.Monkey 测试的特点?Monkey 测试,所有的事件都是随机产生的,不带任何人的主观性. 四.Monkey 命令详解 1).标准的monkey 命令[adb shell] monkey [options] <eventcount> , 例如:adb shell monkey -
-
详解Python编程中对Monkey Patch猴子补丁开发方式的运用
Monkey patch就是在运行时对已有的代码进行修改,达到hot patch的目的.Eventlet中大量使用了该技巧,以替换标准库中的组件,比如socket.首先来看一下最简单的monkey patch的实现. class Foo(object): def bar(self): print 'Foo.bar' def bar(self): print 'Modified bar' Foo().bar() Foo.bar = bar Foo().bar() 由于Python中的名字空间是开放
-
javascript SpiderMonkey中的函数序列化如何进行
在Javascript中,函数可以很容易的被序列化(字符串化),也就是得到函数的源码.但其实这个操作的内部实现(引擎实现)并不是你想象的那么简单.SpiderMonkey中一共使用过两种函数序列化的技术:一种是利用反编译器(decompiler)将函数编译后的字节码反编译成源码字符串,另一种是在将函数编译成字节码之前就把函数源码压缩并存储下来,用到的时候再解压还原. 如何进行函数序列化 在SpiderMonkey中,能将函数序列化的方法或函数有三个:Function.prototype.toSt
-
android monkey自动化测试改为java调用monkeyrunner Api
众所周知,一般情况下我们使用android中的monkeyrunner进行自动化测试时,使用的是python语言来写测试脚本.不过,最近发现可以用java调用monkeyrunner Api,用java语言写测试脚本. 于是,就简单研究了一下.这里做一些总结.希望有对在研究的午饭可以有所用处. 开始时,搜素到一些零碎的教程,说使用java调用monkeyrunner时,需要导入android sdk tools路径下的lib里面的4个包:ddmlib.jar,guavalib.jar,monk
-
Ruby使用Monkey Patch猴子补丁方式进行程序开发的示例
猴子补丁(Monkey Patch)是一种特殊的编程技巧.Monkey patch 可以用来在运行时动态地修改(扩展)类或模块.我们可以通过添加 Monkey Patch 来修改不满足自己需求的第三方库,也可以添加 Monkey Patch 零时修改代码中的错误. 词源 Monkey patch 最早被称作 Guerrilla patch,形容这种补丁像游击队员一样狡猾.后来因为发音相似,被称为 Gorilla patch.因为大猩猩不够可爱,后改称为 Monkey patch. 使用场景 以我
-
Monkey Patch猴子补丁编程方式及其在Ruby中的运用
何谓猴子补丁(Monkey Patch)?在动态语言中,不修改源代码而对功能进行追加和变更. 使用猴子补丁的目的: 1.追加功能 2.功能变更 3.修正程序错误 4.增加钩子,在执行某个方法的同时执行一些其他的处理,如打印日志,实现AOP等, 5.缓存,在计算量很大,结算之后的结果可以反复使用的情况下,在一次计算完成之后,对方法进行替换可以提高处理速度. Ruby的类都是开放类,即在类定义之后还可以任意添加内容, 这就使得在Ruby中使用猴子补丁变得特别容易了.另外,Ruby还提供了对方法.类和
-
python 猴子补丁(monkey patch)
写了一段时间java切回写python偶尔会出现一些小麻烦,比如:在java中自定义对象变成json串很简单,调用一个方法就行,但同样的转换在python中却不太容易实现.在寻找python自定义对象转json串的过程中,接触到了猴子补丁这个东西,感觉还有点意思:本文先实现python自定义对象转json串,再简单谈一下猴子补丁. python自定义对象转json串 python自带的json包不支持自定义对象转json串,在python中用json.dumps转自定义对象时会报异常class
-
Python猴子补丁Monkey Patch用法实例解析
属性在运行时的动态替换,叫做猴子补丁(Monkey Patch). 为什么叫猴子补丁 属性的运行时替换和猴子也没什么关系,关于猴子补丁的由来网上查到两种说法: 1.这个词原来为Guerrilla Patch,杂牌军.游击队,说明这部分不是原装的,在英文里guerilla发音和gorllia(猩猩)相似,再后来就写了monkey(猴子). 2.还有一种解释是说由于这种方式将原来的代码弄乱了(messing with it),在英文里叫monkeying about(顽皮的),所以叫做Monkey
-
简单聊聊Python中的鸭子类型和猴子补丁
目录 前言 鸭子类型 猴子补丁 总结 前言 Python 开发者可能都听说过鸭子类型和猴子补丁这两个词,即使没听过,也大概率写过相关的代码,只不过并不了解其背后的技术要点是这两个词而已. 我最近在面试候选人的时候,也会问这两个概念,很多人答的也并不是很好.但是当我向他们解释完之后,普遍都会恍然大悟:“哦,是这个啊,我用过”. 所以,我决定来写一篇文章,探讨一下这两个技术. 鸭子类型 引用维基百科中的一段解释: 鸭子类型(duck typing)在程序设计中是动态类型的一种风格.在这种风格中,一个
-
Python猴子补丁知识点总结
属性在运行时的动态替换,叫做猴子补丁(Monkey Patch). 为什么叫猴子补丁 属性的运行时替换和猴子也没什么关系,关于猴子补丁的由来网上查到两种说法: 1.这个词原来为Guerrilla Patch,杂牌军.游击队,说明这部分不是原装的,在英文里guerilla发音和gorllia(猩猩)相似,再后来就写了monkey(猴子). 2.还有一种解释是说由于这种方式将原来的代码弄乱了(messing with it),在英文里叫monkeying about(顽皮的),所以叫做Monkey
-
生产消费者模式实现方式和线程安全问题代码示例
生产者消费者模式的几种实现方式 拿我们生活中的例子来说,工厂生产出来的产品总是要输出到外面使用的,这就是生产与消费的概念. 在我们实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类.函数.线程.进程等). 产生数据的模块,就形象地称为生产者;而处理数据的模块,就称为消费者. 第一种:采用wait-notify实现生产者消费者模式 1. 一生产者与一消费者: 2. 一生产者与多消费者: 第二种: 采用阻塞队列实现生产者消费者
-
Centos中yum方式安装java的实现示例
查看CentOS自带JDK是否已安装 [root@test ~]# yum list installed |grep java 若有自带安装的JDK,应如下操作进行卸载CentOS系统自带Java环境 [root@test ~]# java -version java version "1.7.0_181" OpenJDK Runtime Environment (rhel-2.6.14.8.el6_9-x86_64 u181-b00) OpenJDK 64-Bit Server VM
-
SpringMVC用XML方式实现AOP的方法示例
1.首先创建web工程,之后导入Spring jar包,目录如下 2.文件代码 2.1AfterAdvice package com.niit.aop; import java.lang.reflect.Method; import org.springframework.aop.AfterReturningAdvice; /* * 后置通知 * havingClass方法执行之后才执行. * 输出日记 * */ public class AfterAdvice implements After
随机推荐
- JS实现分页浏览横向图片(类轮播)实例代码
- mysql把一个表某个字段的内容复制到另一张表的某个字段的SQL语句写法
- ORACLE学习笔记-新建用户及建表篇
- 企业上网的几个理由
- java之swing表格实现方法
- Objective-C的缓存框架EGOCache在iOS App开发中的使用
- 提交页面的定位--scrollIntoView的用法
- Yii2如何批量添加数据
- php微信公众平台开发之获取用户基本信息
- Python序列之list和tuple常用方法以及注意事项
- 一份ASP内存的释放的实验报告
- 用JS实现一个TreeMenu效果分享
- Android中使用HTTP服务的用法详解
- JS实现简单易用的手机端浮动窗口显示效果
- 三行Android代码实现白天夜间模式流畅切换
- .net控件dropdownlist动态绑定数据具体过程分解
- JavaScript使用concat连接数组的方法
- CentOS6 配置Nginx,MySql,php-fpm开机启动的方法
- asp.net下将纯真IP数据导入数据库中的代码
- IOS框架Spring常用的动画效果