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

时间:2016-02-25 18:59:29

标签: python python-3.x decorator python-import

我导入了一些模块Foo并使用该模块中定义的类Foo。该类具有函数f,该函数调用该模块g本身从Foo导入的另一个函数module_with_g。我想重新定义g f在我实例化Foo时使用的定义。这里有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()

2 个答案:

答案 0 :(得分:5)

我可以做到这一点,我在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

答案 1 :(得分:1)

如果您真的希望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,则不再重新导入class Test { public Func<object> GetSomething = null; } var t = new Test(); var result = t?.GetSomething(); ,因此可以利用此功能。