• 【2020Python修炼记】面向对象编程——猴子补丁


     

    1 什么是猴子补丁

    在移动开发中,用户不用更新整个app,只需要更新app中的一部分,而且是在运行时动态更新。

    在运行时动态更新的这一部分功能,就可以称作“猴子补丁”。

    猴子补丁不仅能用来更新app,还能在不修改第三方源码的情况下,增加第三方库本来没有的功能。

    因为这种在运行时动态打补丁的方法,实在算不上光明正大,有点偷偷摸摸的感觉。

    而且这种打补丁的方法,最大的问题在于兼容性很难保证,如果测试不充分,有可能导致应用在某些系统上出现莫名其妙的bug。

    ---》简而言之

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

    由于Python类的方法其实也只是一个属性,可以随时修改,所以用Python做猴子补丁非常方便。


     2 栗子

    import json
    import ujson  # pip3 install ujson
    
    def monkey_patch():
        json.__name__ = ujson.__name__
        json.dumps = ujson.dumps
        json.loads = ujson.loads

     

    3 补充

    # 一.什么是猴子补丁?
          属性在运行时的动态替换,叫做猴子补丁(Monkey Patch)。
          猴子补丁的核心就是用自己的代码替换所用模块的源代码,详细地如下
      1,这个词原来为Guerrilla Patch,杂牌军、游击队,说明这部分不是原装的,在英文里guerilla发音和gorllia(猩猩)相似,再后来就写了monkey(猴子)。
      2,还有一种解释是说由于这种方式将原来的代码弄乱了(messing with it),在英文里叫monkeying about(顽皮的),所以叫做Monkey Patch。
    
    
    # 二. 猴子补丁的功能(一切皆对象)
      1.拥有在模块运行时替换的功能, 例如: 一个函数对象赋值给另外一个函数对象(把函数原本的执行的功能给替换了)
    class Monkey:
        def hello(self):
            print('hello')
    
        def world(self):
            print('world')
    
    
    def other_func():
        print("from other_func")
    
    
    
    monkey = Monkey()
    monkey.hello = monkey.world
    monkey.hello()
    monkey.world = other_func
    monkey.world()
    
    # 三.monkey patch的应用场景
    如果我们的程序中已经基于json模块编写了大量代码了,发现有一个模块ujson比它性能更高,
    但用法一样,我们肯定不会想所有的代码都换成ujson.dumps或者ujson.loads,那我们可能
    会想到这么做
    import ujson as json,但是这么做的需要每个文件都重新导入一下,维护成本依然很高
    此时我们就可以用到猴子补丁了
    只需要在入口处加上
    , 只需要在入口加上:
    
    import json
    import ujson
    
    def monkey_patch_json():
        json.__name__ = 'ujson'
        json.dumps = ujson.dumps
        json.loads = ujson.loads
    
    monkey_patch_json() # 之所以在入口处加,是因为模块在导入一次后,后续的导入便直接引用第一次的成果
    
    #其实这种场景也比较多, 比如我们引用团队通用库里的一个模块, 又想丰富模块的功能, 除了继承之外也可以考虑用Monkey
    Patch.采用猴子补丁之后,如果发现ujson不符合预期,那也可以快速撤掉补丁。个人感觉Monkey
    Patch带了便利的同时也有搞乱源代码的风险!
        
    猴子补丁与ujson


  • 相关阅读:
    有关C#中List排序的总结
    配置jdk1.8.0_77
    New Day
    HDU 4288 Coder 线段树
    AOJ 169 找零钱 DP OR 母函数
    HDU 3954 Level up 线段树
    HDU 3016 Man Down 线段树+简单DP
    HDU 4027 Can you answer these queries? 线段树
    HDU 3333 Turing Tree 树状数组 离线查询
    POJ 2464 Brownie Points II 树状数组+扫描线
  • 原文地址:https://www.cnblogs.com/bigorangecc/p/13750702.html
Copyright © 2020-2023  润新知