一尘不染

Python-什么是Monkeypatching丁?

python Monkeypatching

我想了解什么是Monkeypatching丁?

是类似方法/操作符的重载或委派吗?

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


阅读 427

收藏
2020-02-10

共2个答案

一尘不染

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

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

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

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

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

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

2020-02-10
一尘不染

MonkeyPatch是一段Python代码,可在运行时(通常在启动时)扩展或修改其他代码。

一个简单的示例如下所示:

from SomeOtherProduct.SomeModule import SomeClass

def speak(self):
    return "ook ook eee eee eee!"

SomeClass.speak = speak
2020-02-10