zoukankan      html  css  js  c++  java
  • python运行时修改代码的方法——monkey patch

    monkey patch (猴子补丁)
       用来在运行时动态修改已有的代码,而不需要修改原始代码。

    简单的monkey patch 实现:

    #coding=utf-8
    def originalFunc():
        print 'this is original function!'
        
    def modifiedFunc():
        modifiedFunc=1
        print 'this is modified function!'
        
    def main():
        originalFunc()
        
    if __name__=='__main__':
        originalFunc=modifiedFunc
        main()


     

    python中所有的东西都是object,包括基本类型。查看一个object的所有属性的方法是:dir(obj)
    函数在python中可以像使用变量一样对它进行赋值等操作。
    查看属性的方法:

    print locals()
    print globals()


     

    当我们import一个module时,python会做以下几件事情


      •导入一个module
      •将module对象加入到sys.modules,后续对该module的导入将直接从该dict中获得
      •将module对象加入到globals dict中


    当我们引用一个模块时,将会从globals中查找。这里如果要替换掉一个标准模块,我们得做以下两件事情


        1.将我们自己的module加入到sys.modules中,替换掉原有的模块。如果被替换模块还没加载,那么我们得先对其进行加载,否则第一次加载时,还会加载标准模块。(这里有一个import hook可以用,不过这需要我们自己实现该hook,可能也可以使用该方法hook module import)
        2.如果被替换模块引用了其他模块,那么我们也需要进行替换,但是这里我们可以修改globals dict,将我们的module加入到globals以hook这些被引用的模块。
     

  • 相关阅读:
    iOS 中UI控件的各种对齐方式总结
    BLE 广播数据解析
    Objective-C中一种消息处理方法performSelector: withObject:
    ios的@property属性和@synthesize属性
    iOS中的字符串扫描类NSScanner
    iOS开发技巧(系列十八:扩展UIColor,支持十六进制颜色设置)
    NSMakeRange基础函数应用
    Objective-C中的占位符,打印BOOL类型数据
    NSUInteger和NSInteger和int
    HDU4870:Rating(DP)
  • 原文地址:https://www.cnblogs.com/chenjianhong/p/4144888.html
Copyright © 2011-2022 走看看