如何重新定义我在 python 中导入的函数使用的函数?

How to redefine the function that a function I import in python uses?

我导入了一些模块 Foo 并使用了该模块中定义的 class Foo。 class 具有函数 f,该函数调用另一个函数 g,该模块 Foo 本身从 module_with_g 导入。我想重新定义 f 在实例化 Foo 时使用的 g 的定义。这是显示情况的 3 个文件。

Foo.py

from module_with_g import g

class Foo:
    def f(self):
        x = 'bar'
        g(x)

module_with_g.py

def g(x):
    print(x + x)

module_with_modified_Foo_f.py

import Foo

def new_g(x):
    print(x + x + x)

if __name__ == '__main__':
    foo =  Foo.Foo()
    foo.f()

运行 最后一个脚本给出 barbar。我想要的是让 foo.f 使用我自己的函数而不是它的 g,我希望得到 barbarbar

我自己的尝试是尝试使用装饰器以某种方式重新定义 foo.f,但我没有任何运气。

module_with_modified_Foo_f.py

import Foo

def new_g(x):
    print(x + x + x)

def redefine_f(f):
    def redefined_f(*args, **kwargs):
        return f(*args, **kwargs)
    #redefined_f.g = new_g
    return redefined_f

if __name__ == '__main__':
    foo =  Foo.Foo()
    # foo.f = redefine_f(foo.f)
    # foo.__dict__['g'] = new_g # another approach
    foo.f()

如果你真的希望Foo.py和你写的一模一样,可以使用如下module_with_modified_Foo_f.py:

import module_with_g

def new_g(x):
    print(x + x + x)

module_with_g.g = new_g

import Foo

if __name__ == '__main__':
    foo =  Foo.Foo()
    foo.f()

Foo如果已经被导入,则不会第二次重新导入module_with_g,所以这可以被利用。

我可以简单的,我在module_with_modified_Foo_f.py

中修改为Foo.g = new_g
import Foo
def new_g(x):
    print(x + x + x)
Foo.g = new_g
if __name__ == '__main__':
    foo =  Foo.Foo()
    foo.f()

我得到的结果是 - barbarbar