【问题标题】:How to redefine the function that a function I import in python uses?如何重新定义我在 python 中导入的函数使用的函数?
【发布时间】:2016-06-08 17:45:31
【问题描述】:

我导入了一些模块 Foo 并使用该模块中定义的类 Foo。该类具有函数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.g = new_g 中尝试一些东西,其中Foo 是模块,而不是类。
  • 您为什么需要这样做?如果是用于测试,可以使用unittest.mock.patch()。如果不考虑重新设计您的程序,因为在运行时更改功能是一种公认​​的让自己陷入困境的方法之一。 ;)
  • @YaroslavAdmin 这样我就不需要更改我正在使用的某些库的实际源代码。

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


【解决方案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()

如果module_with_g已经被导入,Foo不会第二次重新导入它,因此可以利用它。

【讨论】:

  • 谢谢,这正是我想做的。
  • 实际上,我认为@AlokThakur 解决方案更干净、更优雅,现在我看到了。你不需要用它来打乱导入语句,所以我建议你改用它。
【解决方案2】:

我可以很简单,我在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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    相关资源
    最近更新 更多