gpt4 book ai didi

python - Python 中猴子补丁的底层是什么

转载 作者:太空宇宙 更新时间:2023-11-04 03:25:14 25 4
gpt4 key购买 nike

我有点困惑,并试图了解下面的内容,希望我能更好地理解 Monkey Patch。

我读过 Where to patch我知道我必须从你使用模块的地方打补丁。但是在文档中。

a.py
-> Defines SomeClass

b.py
-> from a import SomeClass
-> some_function instantiates SomeClass

如果我这样做 from a import SomeClass

然后我必须像这样打补丁。

@patch('b.SomeClass')

但是,为什么我要这样导入模块。

导入一个

我不得不像这样使用补丁。

@patch('a.SomeClass')

我只知道如何使用补丁,但我不明白为什么会这样?是Python导入模块的方式吗?

最佳答案

目标是拦截和修改将由您想要影响其行为的函数使用的引用。最初,a.SomeClassb.SomeClass 指向同一个对象;但补丁会将其中一个引用替换为其他内容。

在文档中,示例是您要修改被some_function 看到和使用的SomeClass。所以重要的是 some_function() 是如何引用 SomeClass 的:

  1. 如果 some_function 包含对普通 SomeClass 的引用,它将被解析为它自己模块中的一个变量:b in这个例子(顺便说一下 b 通过导入创建了这个变量)。因此 b.SomeClass 是需要修补的。

  2. 如果 some_function 明确引用 a.SomeClass,那么这是需要修补的引用。

假设模块 b.py 包含这两行:

import a
from a import SomeClass

应该修补哪个引用?为什么,some_function 使用的那个!重要的不是它如何导入 b,而是使用它的代码如何访问它。

关于python - Python 中猴子补丁的底层是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33331234/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com