zoukankan      html  css  js  c++  java
  • python中的猴子补丁Monkey Patch

    python中的猴子补丁Monkey Patch

    什么是猴子补丁

    the term monkey patch only refers to dynamic modifications of a class or module at runtime, motivated by the intent to patch existing third-party code as a workaround to a bug or feature which does not act as desired

    即在运行时对方法 / 类 / 属性 / 功能进行修改,把新的代码作为解决方案代替原有的程序,也就是为其打上补丁。

    为什么叫做猴子补丁

    The term monkey patch seems to have come from an earlier term, guerrilla patch, which referred to changing code sneakily – and possibly incompatibly with other such patches – at runtime.The word guerrilla, homophonous with gorilla (or nearly so), became monkey, possibly to make the patch sound less intimidating.[1] An alternative etymology is that it refers to “monkeying about” with the code (messing with it).

    • 一种说法杂牌军、游击队的英文发音与猩猩相似,杂牌军、游击队不是原装军队,就像是替补,所以也就演变叫做猴子补丁
    • 另一种说法“monkeying about”有胡闹,顽皮,哄骗的意思,所以叫做猴子补丁

    python中使用猴子补丁

    
    class Example():
        def func1(self):
            print('我才是原装')
    
    def func2(*args):
        print('我要取代你')
    
    def func3(*args):
        print('都给我一边去')
    
    instance = Example()
    Example.func1 = func2
    instance.func1() # 我要取代你
    instance.func1 = func3
    instance.func1() # 都给我一边去
    instance2 = Example()
    instance2.func1() # 我要取代你
    

    例子非常简单,func2取代的是类的方法,func3取代的是实例的方法,最终输出都不是原装

    其他例子

    在使用gevent模块的使用就会遇到猴子补丁

    import gevent.monkey
     gevent.monkey.patch_all()
    

    使用猴子补丁的方式,gevent能够修改标准库里面大部分的阻塞式系统调用,包括socket、ssl、threading和 select等模块,而变为协作式运行。也就是通过猴子补丁的monkey.patch_xxx()来将python标准库中模块或函数改成gevent中的响应的具有协程的协作式对象。这样在不改变原有代码的情况下,将应用的阻塞式方法,变成协程式的。
    这里参考https://blog.csdn.net/wangjianno2/article/details/51708658

    注意问题

    在使用猴子补丁的时候同样容易出现问题

    • 当进行版本更新变化的时候,很容易对补丁做出破坏
    • 不知情的情况下对一个位置打两个补丁会造成替换
    • 对于不知道有补丁的人来说可能会对出现的某些情况感到困惑

    参考https://en.wikipedia.org/wiki/Monkey_patch

  • 相关阅读:
    hdu 1408 acdearm "Money, Money, Money"
    hdu 1284 钱币兑换问题
    hdu 1248 寒冰王座
    hdu 1203 I NEED A OFFER!
    acdream 1726 A Math game
    csu 1640 机智的刷题方式(完全背包)
    NYOJ 734 奇数阶魔方
    bestcoder Round #79 (div.2)jrMz and angles
    南阳oj 题目6 喷水装置(一)
    小区的路
  • 原文地址:https://www.cnblogs.com/sfencs-hcy/p/10549898.html
Copyright © 2011-2022 走看看