小编典典

什么是monkeypatching?

python

我想了解什么是猴子补丁或猴子补丁?

是方法/操作符重载还是委派?

这些东西有什么共同点吗?


阅读 347

收藏
2020-07-27

共1个答案

小编典典

不,这与任何事情都不一样。它只是在运行时动态替换属性。

例如,考虑一个具有method的类get_data。该方法进行外部查找(例如,在数据库或Web API上),并且类中的各种其他方法都调用它。但是,在单元测试中,您不希望依赖于外部数据源-因此,您可以用get_data存根(返回一些固定数据)动态替换该方法。

由于Python类是可变的,并且方法只是类的属性,因此您可以随意执行此操作-实际上,您甚至可以以完全相同的方式替换模块中的类和函数。

但是,正如评论员指出的那样,在进行猴子修补时要格外小心:

如果除了测试逻辑调用之外还有其他要求get_data,它还会调用猴子修补的替代品,而不是原始替代品-可能是好是坏。提防。

如果存在某些变量或属性get_data,在您替换它时也指向该函数,则该别名将不会更改其含义,并且将继续指向原始变量get_data。(为什么?Python只是get_data将类中的名称重新绑定到其他函数对象;其他名称绑定完全不受影响。)

2020-07-27