如何重新定义我在 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
我导入了一些模块 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