python中patch的使用

本文介绍了在Python中如何替换已导入的模块,通过修改sys.modules和globalsdict实现自定义模块的覆盖,并提供了一个具体实例来展示如何修改现有模块的行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、由于python是一切皆对象,当我们import一个module时,python会做以下几个事情:

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

因此当我们引入一个模块时,会从global中查找,如果需要替换原有模块,需要做以下两件事情:

  •     将我们自己的module加入到sys.modules中,替换原有的模块,如果被替换模块还没有加载,我们要先对其进行加载,否则第一次加载时,还会加载标准模块;
  •     如果被替换模块引入了其他模块,也要对其进行替换,这里我们可以修改globals dict,将我们的module加入到globals以hook这些被引用的模块。

2、下面看一个例子

  1. #coding=utf-8
  2. class TestPath(object):
  3. def __init__(self, name, age):
  4. self.name=name
  5. self.age = age
  6. def sayName(self):
  7. print self.name
  8. def sayName():
  9. print "your name is haha!"
  10. if __name__=="__main__":
  11. testpath = TestPath("xiaowang",27)
  12. testpath.sayName()
  13. print "modify the patch"
  14. testpath.sayName = sayName
  15. testpath.sayName()
输出结果:
  1. xiaowang
  2. modify the patch
  3. your name is haha!
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值