Python 猴子补丁
Python 猴子补丁
13 Jun 2015
我们知道Python是动态类型的编程语言,当我们在定义类后对类或实例的操作往往可以动态改变它,如下:
class Foo(object):
    def bar(self):
        print 'FOO.bar'
def bar(self):
    print 'Module.bar'
def other(self):
    print 'Other things'
Foo().bar()             # FOO.bar
# 动态修改
Foo.bar = bar
Foo().bar()             # Module.bar
# 动态添加
Foo.other = other
Foo().other()           # Other things
# 动态删除
del Foo.bar
print Foo.__dict__      # {'other': <function other at 0x106a492a8>, ...}
像这样在动态语言中,不去改变源码而对功能进行追加和变更就叫做Monkey Patching(猴子补丁),实现这个得益于:
- 动态类型的特性
- Python一切皆对象,函数在Python中可以像变量一样传递
- Python namespace开放性,这样可以任意替换模块
使用猴子补丁目的:
- 追加功能
- 功能变更
- 修正程序错误
- 增加钩子,在执行某个方法的同时执行一些其他的处理,如打印日志,实现AOP等,
- 缓存,在计算量很大,结算之后的结果可以反复使用的情况下,在一次计算完成之后,对方法进行替换可以提高处理速度。
这样就达到了hot patch的特性,猴子补丁这种东西充分利用了动态语言的灵活性,可以对现有的语言Api进行追加,替换,修改Bug,甚至性能优化等等。比如gevent的猴子补丁就可以对ssl、socket、os、time、select、thread、subprocess、sys等模块的功能进行了增强和替换.
todo: 研究gevent以及其中猴子补丁的实现
在使用猴子补丁的时候,还应注意如下事项:
- 基本上只追加功能,尽量避免大规模的API覆盖
- 进行功能变更时要谨慎,尽可能的小规模
- 注意相互调用
参考:Ruby之猴子补丁
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号