如何替换现有方法中的函数调用
How to replace a function call in an existing method
给定一个带有 class Foo 的模块,该模块具有调用模块范围内定义的函数 bar
的方法,有没有办法用 bar
替换不同的函数而不用修改模块?
class Foo(object):
def run(self):
bar()
def bar():
return True
然后我有一个 Foo
的实例,我想用函数 baz()
代替 bar()
而不必修改 Foo
class.
假设您的模块名为 deadbeef
,并且您是这样使用它的
import deadbeef
…
foo_instance = deadbeef.Foo()
那么你可以
import deadbeef
deadbeef.bar = baz
…
您可以在 运行 时对 Foo
进行猴子修补,并覆盖方法 run
。
例如,如果 foo
是 Foo
的实例,您可以这样做:
def run(obj):
baz()
foo.run = run
下次调用 foo.run
时,它将调用 baz
。
在这里查看更多内容http://blog.tryolabs.com/2013/07/05/run-time-method-patching-python/
我最近问了类似的问题,staticmethod 是答案(因为你的 baz 和 bar 似乎不是方法)。基本上,您想做一些类似策略模式的事情,并从 运行().
调用不同的函数
def bar():
print "I am bar()"
return True
def baz():
print "I am baz()"
return True
class Foo(object):
# default to running bar.
torun = staticmethod(bar)
def run(self):
self.torun()
foo = Foo()
foo.run()
foo2 = Foo()
foo2.torun = baz
foo2.run()
输出:
I am bar()
I am baz()
您几乎可以为 foo 实例分配您想要的任何内容,包括在不同模块上定义的函数。 运行 可以采用 *args 和 **kwds 以获得更大的灵活性。
给定一个带有 class Foo 的模块,该模块具有调用模块范围内定义的函数 bar
的方法,有没有办法用 bar
替换不同的函数而不用修改模块?
class Foo(object):
def run(self):
bar()
def bar():
return True
然后我有一个 Foo
的实例,我想用函数 baz()
代替 bar()
而不必修改 Foo
class.
假设您的模块名为 deadbeef
,并且您是这样使用它的
import deadbeef
…
foo_instance = deadbeef.Foo()
那么你可以
import deadbeef
deadbeef.bar = baz
…
您可以在 运行 时对 Foo
进行猴子修补,并覆盖方法 run
。
例如,如果 foo
是 Foo
的实例,您可以这样做:
def run(obj):
baz()
foo.run = run
下次调用 foo.run
时,它将调用 baz
。
在这里查看更多内容http://blog.tryolabs.com/2013/07/05/run-time-method-patching-python/
我最近问了类似的问题,staticmethod 是答案(因为你的 baz 和 bar 似乎不是方法)。基本上,您想做一些类似策略模式的事情,并从 运行().
调用不同的函数def bar():
print "I am bar()"
return True
def baz():
print "I am baz()"
return True
class Foo(object):
# default to running bar.
torun = staticmethod(bar)
def run(self):
self.torun()
foo = Foo()
foo.run()
foo2 = Foo()
foo2.torun = baz
foo2.run()
输出:
I am bar()
I am baz()
您几乎可以为 foo 实例分配您想要的任何内容,包括在不同模块上定义的函数。 运行 可以采用 *args 和 **kwds 以获得更大的灵活性。