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对象。

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

  • 相关阅读:
    【js】栈方法和队列方法
    adb devices 不能连接设备 could not install *smartsocket* listener
    mysql无法启动服务,错误1067
    Sql Server存储过程详解
    ef not in
    checkbox多选框取值
    Linq 常用操作(增删改)
    二进制与图片相互转换
    jQuery 二级联动
    百度地图API功能
  • 原文地址:https://www.cnblogs.com/yhleng/p/11726046.html
Copyright © 2011-2022 走看看