如何替换现有方法中的函数调用

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

例如,如果 fooFoo 的实例,您可以这样做:

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 以获得更大的灵活性。