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

  • 相关阅读:
    Python学习札记(十五) 高级特性1 切片
    LeetCode Longest Substring Without Repeating Characters
    Python学习札记(十四) Function4 递归函数 & Hanoi Tower
    single number和变体
    tusen 刷题
    实验室网站
    leetcode 76. Minimum Window Substring
    leetcode 4. Median of Two Sorted Arrays
    leetcode 200. Number of Islands 、694 Number of Distinct Islands 、695. Max Area of Island 、130. Surrounded Regions 、434. Number of Islands II(lintcode) 并查集 、178. Graph Valid Tree(lintcode)
    刷题注意事项
  • 原文地址:https://www.cnblogs.com/sfencs-hcy/p/10549898.html
Copyright © 2011-2022 走看看