Python 中的 Monkey Patching

17 Mar 2025 | 阅读 2 分钟

Monkey Patching 是 Python 中一个令人兴奋的话题。Monkey-patching 是指在运行时修改类或模块。简单来说,可以在运行时更改类或模块的功能。让我们通过现实生活中的例子来理解这个概念。

当我们在一个大型项目中工作时,可能会遇到第三方库运行不正常的情况。因此,我们会尝试在我们的项目中修改(或更改)它。这个过程在 Python 中被称为 monkey patching。通常,开发者会避免这样做。然而,它是开发过程的一部分。

在 monkey patching 中,我们可以重新打开一个类并修改其行为。

我们将学习如何使用 Python 代码来实现 monkey-patching。

我们知道 Python 是一种动态语言;类是可变的,所以我们可以在任何时候修改它们。让我们理解下面的例子。

示例 -

输出

30
[('__init__', >), ('add', >)]

正如我们在上面的代码中看到的,上面类中有两个方法 - __init__ 和 addition。我们调用了 add() 方法并传递了 20 作为参数。它返回 30。我们定义了带有 add() 方法的 MultiPatch 类。假设我们向 MonkeyPatch 类添加新方法。

要将 divide() 方法添加到 MonkeyPatch 类,只需将 divide 函数赋给 MonkeyPatch 即可。

新创建的函数将可以在 MonkeyPatch 类中使用。让我们看下面的例子。

输出

[('__init__', >), ('subtraction', >)]

函数的动态行为

让我们看另一个例子,以更好地理解动态行为。

示例 -

我们创建了一个模块,将在下面的代码中使用它来在运行时更改 hello() 函数的行为。

输出

monkey_f() is being called

内存地址更改

Python 提供了 ctype 模块,用于通过内存地址管理来更改对象的值。因此,不建议这样做,直接的内存操作是不安全的,并且不一致。可能它能处理一个值,但不能处理另一个。

结论

我们已经讨论了如何在 Python 中实现 monkey-patching。但它存在一些缺点,应该谨慎使用。它不适合用于应用程序设计,因为它会区分磁盘上的源代码和观察到的行为。开发人员在调试时可能会感到困惑。


下一个主题Python __call__ 方法