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

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

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

最佳答案

不,这与这些东西都不一样。它只是在运行时动态替换属性。

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

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

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

  • 如果测试逻辑之外的其他任何内容也调用get_data,它也将调用猴子修补的替代品,而不是原始的替代品-可能是好是坏。提防。
  • 如果存在一些变量或属性,这些变量或属性在您替换它时也指向get_data函数,则该别名不会更改其含义,并且将继续指向原始get_data。 (为什么?Python只是将类中的名称get_data重新绑定(bind)到其他函数对象;其他名称绑定(bind)完全不受影响。)
  • 10-08 19:47