覆盖(monkeypatch)第 3 方模块中由该第 3 方模块中的其他函数使用的函数

override (monkeypatch) a function in a 3rd party module used by other functions in that 3rd party module

我想覆盖某些第 3 方代码的内部函数。这是我的意图的一个例子。

(编辑:我已经更正了下面的拼写错误,现在 可以正常工作了)

#--- dog.py (3rd party code) ---
def _bark():
    print("WOOF!")

def make_it_bark():
    _bark()

#--- make_catlike.py (my code)---
import dog
dog._bark = lambda: print("MEOW") #<<-- 'bark' in original, so failed!!!!
dog.make_it_bark()
# edit: now prints out "MEOW" instead of "WOOF!" like I want

如何让第 3 方 dog.py 代码使用 my 版本的 _bark?

[结论:这只是因为拼写错误而失败。感谢您的帮助!!]

您在 make_catlike.py 中有一个简单的拼写错误 --- 您缺少前导下划线。整个文件应为:

#--- make_catlike.py (my code)---
import dog
dog._bark = lambda: print("MEOW")
#   ^-------- Underscore was missing.
dog.make_it_bark()  # Prints "MEOW".

请注意,在更复杂的情况下,其他类型的事情可能会出错...

例如,如果您要更改的行为发生在导入模块时,则更改该模块的代码 after import dog returns 不会帮助。

在您提供的代码中,确保您在重新定义 _bark 函数时没有忘记下划线。 如果您想更改 class 的方法,一个好主意是继承 class 并覆盖 class 中的方法。