我导入了一些模块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()
答案 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();
,因此可以利用此功能。