1、由于python是一切皆对象,当我们import一个module时,python会做以下几个事情:
- 导入一个module
- 将module对象加入到sys.modules中,后续对该module的导入将直接从该dict中获得
- 将module对象加入到golbal dict中
因此当我们引入一个模块时,会从global中查找,如果需要替换原有模块,需要做以下两件事情:
- 将我们自己的module加入到sys.modules中,替换原有的模块,如果被替换模块还没有加载,我们要先对其进行加载,否则第一次加载时,还会加载标准模块;
- 如果被替换模块引入了其他模块,也要对其进行替换,这里我们可以修改globals dict,将我们的module加入到globals以hook这些被引用的模块。
2、下面看一个例子
#coding=utf-8
class TestPath(object):
def __init__(self, name, age):
self.name=name
self.age = age
def sayName(self):
print self.name
def sayName():
print "your name is haha!"
if __name__=="__main__":
testpath = TestPath("xiaowang",27)
testpath.sayName()
print "modify the patch"
testpath.sayName = sayName
testpath.sayName()
输出结果:
xiaowang
modify the patch
your name is haha!