gpt4 book ai didi

Python 猴子修补由另一个模块执行的模块

转载 作者:太空宇宙 更新时间:2023-11-03 18:33:54 26 4
gpt4 key购买 nike

我的问题与此类似question

除了在 thirdpartymodule_b 中执行 dosomething() 的不是我的模块,因此我需要猴子修补 thirdpartymodule_a 并在执行时生效在thirdpartymodule_b

最佳答案

我认为您提到的问题和您的情况没有任何区别。在这两种情况下,模块从另一个模块导入名称,并且您想要修补该名称引用的对象。

在该问题中,该模块是由作者编写的,在您的问题中,它是第三方模块。

我认为你的问题在于第三方已经导入了对象名称,所以如果你尝试替换它所在模块中的对象,第三方模块仍然会使用旧的,因为它仍然引用旧对象。

module_1.py

class AForm(Form):
...

module_2.py

from module_1 import AForm

如果导入 module_2,然后对 module_1 进行猴子补丁,将 AForm 替换为另一个对象

class AFormPatched(Form):
...

import module_1
module_1.AForm = AFormPatched

您的更改不会影响 module_2,因为 module_2.AForm 仍然指向原始对象。

解决这个问题:

选项 1。 module_2 应如下所示:

import module_1
module_1.AForm # using AForm in this form

选项 2。还修补 module_2.AForm:

class AFormPatched(Form):
...

import module_1
module_1.AForm = AFormPatched
import module_2
module_2.AForm = AFormPatched

或者不修补 module_1,您只想 module_2 使用修补后的版本。

选项 3. 修补对象的属性。如果您不想或无法对使用对象名称的所有位置进行猴子修补,有时如果您不替换对象,而仅修补其某些属性,那么有时它会起作用。这取决于您尝试修补的对象和行为:

import third_party_module
third_party_module.AForm.__init__ = ...

关于Python 猴子修补由另一个模块执行的模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21923923/

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