zoukankan      html  css  js  c++  java
  • Python中的猴子补丁是什么

    属性在运行时的动态替换,叫做猴子补丁(Monkey Patch)。

    为什么叫猴子补丁

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

    1.这个词原来为Guerrilla Patch,杂牌军、游击队,说明这部分不是原装的,在英文里guerilla发音和gorllia(猩猩)相似,再后来就写了monkey(猴子)。

    2.还有一种解释是说由于这种方式将原来的代码弄乱了(messing with it),在英文里叫monkeying about(顽皮的),所以叫做Monkey 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带了便利的同时也有搞乱源代码优雅的风险。

  • 相关阅读:
    结巴分词 0.14 版发布,Python 中文分词库
    Lazarus 1.0.2 发布,Pascal 集成开发环境
    Android全屏 去除标题栏和状态栏
    服务器日志现 Android 4.2 传将添多项新特性
    Percona XtraBackup 2.0.3 发布
    长平狐 Android 强制设置横屏或竖屏 设置全屏
    NetBeans 7.3 Beta 发布,全新的 HTML5 支持
    CppDepend现在已经支持Linux
    GromJS 1.7.18 发布,服务器端的 JavaScript
    Apache OpenWebBeans 1.1.6 发布
  • 原文地址:https://www.cnblogs.com/daniumiqi/p/12154808.html
Copyright © 2011-2022 走看看