Python如何覆盖在第三方库的模块中定义的方法

Sha*_*iul 9 python python-3.x

我已经通过pip安装了第三方库tornado并且需要覆盖一个方法,比如说在模块的全局范围内定义.因此,对该方法的所有调用都将使用我的重写版本.或者,也许,我想控制它,以便只有我的代码才会使用被覆盖的版本.to_unicodetornado.escape

如果它已在类中定义,那么将它子类化并覆盖该方法没有问题!但由于这只是一种方法,我想知道如何覆盖它.

令人惊讶的是,我发现在SO中找不到合适的解决方案,这种不可能实现吗?

Tim*_*ker 12

您可以简单地将对象的名称(在本例中为模块级函数)重新绑定到另一个对象.例如,如果你想math.cos使用度数而不是弧度,你可以这样做

>>> import math
>>> math.cos(90)
-0.4480736161291701
>>> old_cos = math.cos
>>> def new_cos(degrees):
...     return old_cos(math.radians(degrees))
...
>>> math.cos = new_cos
>>> math.cos(90)
6.123233995736766e-17
Run Code Online (Sandbox Code Playgroud)

但是,这可能会导致使用该模块的其他功能出现问题......

  • @CSJ 是的,这称为猴子修补。 (4认同)
  • 这种方式是所谓的“猴子补丁”吗? (3认同)