覆盖(monkeypatch)第三方模块中

时间:2015-08-21 22:58:42

标签: python module monkeypatching

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

(编辑:我已经纠正了下面的拼写错误,现在确实按预期工作)

#--- 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

如何获取第三方dog.py代码以使用我的版本的_bark?

[结论:由于拼写错误,这只是失败了。谢谢你的帮助!]

2 个答案:

答案 0 :(得分:1)

make_catlike.py中有一个简单的拼写错误---你错过了领先的下划线。整个文件应为:

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

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

例如,如果在导入模块时发生了您想要更改的行为,则在 import dog之后更改该模块的代码将无法帮助。< / p>

答案 1 :(得分:1)

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