zoukankan      html  css  js  c++  java
  • python模块打补丁

    先自定义两个模块,然后,我们调用模块时,用打补丁方式,改写mod_1.py模块。为mod_2.py内容;其实这就相当于,在不改动mod_1.py模块的前提下,打上补丁。

    写这个主要是gevent协程的时候,用到的monkey.patch_all()补丁,其实原理就是这样。

    mod_1.py 

    mod_2.py

     第一种方法:

    调用时实现补丁。

    def monkey_patch_module_2():
        import sys
        import mod_1
    
        #mod_1.mod1_function() #print mod1_function
    
        sys.modules['mod_1'] = __import__("mod_2")
    
        import mod_1
    
        mod_1.mod2_function() #print mod2_function
    
    
    monkey_patch_module_2()

    结果输出:

    mod2_function

    小结:从结果可以看出,我们已经把mod_1.py模块,以补丁的形势,替换到了mod_1.py中。

    其实严格的说,不能算是打补丁,因为这里完全的把mod_1.py模块的内容替换成了mod_2.py。

    这也是在不改变系统原来的代码或内置函数的情况下,来替成我们的代码。注意,这是替换运行时的模块内容。

    第二种方法:

    import mod_1
    import mod_2
    def mokey_patch_m_2():
    
        mod_1.__name__ = "mod_2" #此可有可无,但是防止乱,还是加上好。
        mod_1.mod1_function = mod_2.mod2_function
    
    mokey_patch_m_2()
    mod_1.mod1_function()

    结果:

    mod2_function

    小结:从结果可以看出,mod_1模块的mod1_function()输出的是mod2_function的内容。

    其实不难理解,我们就是在运行时,将mod_1.mod1_funcion对象,替换成mod2_function对象。

    总结:至于这么做有什么用处,主要是在不改变原来的方法,但是又可以通过打补丁的方式,自定义一些功能。  到真正用的时候就你明白有什么用了。

  • 相关阅读:
    learning scala view collection
    scala
    learning scala dependency injection
    learning scala implicit class
    learning scala type alise
    learning scala PartialFunction
    learning scala Function Recursive Tail Call
    learning scala Function Composition andThen
    System.Threading.Interlocked.CompareChange使用
    System.Threading.Monitor的使用
  • 原文地址:https://www.cnblogs.com/yhleng/p/11726046.html
Copyright © 2011-2022 走看看