小编典典

什么是猴子补丁?

all

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

这是否类似于方法/运算符重载或委托?

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


阅读 136

收藏
2022-03-03

共1个答案

小编典典

不,它不像那些东西。它只是在运行时动态替换属性。

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

因为 Python 类是可变的,而方法只是类的属性,所以您可以随心所欲地这样做——事实上,您甚至可以用完全相同的方式替换模块中的类和函数。

但是,正如评论者指出的那样,在进行猴子补丁时要小心:

  1. 如果除了您的测试逻辑之外还有其他调用get_data,它也会调用您的猴子补丁替换而不是原始替换 - 这可能是好是坏。请注意。

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

2022-03-03