给定一个带有类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()
类。
答案 0 :(得分:9)
我们假设您的模块名为receive
,您正在使用它
deadbeef
然后你可以做
import deadbeef
…
foo_instance = deadbeef.Foo()
答案 1 :(得分:4)
您可以在运行时对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/
答案 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以获得更大的灵活性。