【发布时间】: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