我想了解,什么是猴子补丁或猴子补丁?
这是否类似于方法/运算符重载或委托?
这些东西有什么共同点吗?
不,它不像那些东西。它只是在运行时动态替换属性。
例如,考虑一个有方法的类get_data。此方法执行外部查找(例如,在数据库或 Web API 上),类中的各种其他方法调用它。但是,在单元测试中,您不想依赖外部数据源 - 因此您可以get_data使用返回一些固定数据的存根动态替换该方法。
get_data
因为 Python 类是可变的,而方法只是类的属性,所以您可以随心所欲地这样做——事实上,您甚至可以用完全相同的方式替换模块中的类和函数。
但是,正如评论者指出的那样,在进行猴子补丁时要小心:
如果除了您的测试逻辑之外还有其他调用get_data,它也会调用您的猴子补丁替换而不是原始替换 - 这可能是好是坏。请注意。
如果存在某个变量或属性在您替换它时也指向该get_data函数,则此别名不会改变其含义,并将继续指向原始get_data. (为什么?Python 只是get_data将类中的名称重新绑定到其他函数对象;其他名称绑定根本不受影响。)