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

时间:2016-07-12 18:53:13

标签: python monkeypatching

给定一个带有类Foo的模块,该模块具有调用模块范围中定义的函数@Override public void configure(final HttpsParameters params) { try { final SSLParameters sslParams = getSSLContext().getDefaultSSLParameters(); final SSLEngine sslEngine = getSSLContext().createSSLEngine(); sslParams.setNeedClientAuth( true ); sslParams.setCipherSuites( sslEngine.getEnabledCipherSuites() ); sslParams.setProtocols( sslEngine.getEnabledProtocols() ); params.setSSLParameters( sslParams ); } catch ( final Exception e ) { LOG.error( ExceptionUtils.getStackTrace( e ) ); } } 的方法,是否有办法在不修改模块的情况下将bar替换为不同的函数? / p>

bar

然后我有一个class Foo(object): def run(self): bar() def bar(): return True 的实例,我想用Foo代替baz(),而不必修改bar()类。

3 个答案:

答案 0 :(得分:9)

我们假设您的模块名为receive,您正在使用它

deadbeef

然后你可以做

import deadbeef
…
foo_instance = deadbeef.Foo()

答案 1 :(得分:4)

您可以在运行时对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/

答案 2 :(得分:0)

我最近问过类似的东西, staticmethod 就是答案(因为你的baz和bar似乎不是方法)。基本上,您希望执行类似策略模式的操作,并从run()调用不同的函数。

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