【问题标题】:override (monkeypatch) a function in a 3rd party module used by other functions in that 3rd party module覆盖(monkeypatch)该第 3 方模块中的其他功能使用的第 3 方模块中的功能
【发布时间】:2015-08-21 22:58:42
【问题描述】:

我想覆盖某个第 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?

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

【问题讨论】:

    标签: python module monkeypatching


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      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 返回将无济于事。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-06
        • 1970-01-01
        • 1970-01-01
        • 2011-09-02
        • 1970-01-01
        • 2019-06-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多