在Python中调用另一个类的方法
我正在尝试创建一个类,这个类可以保存另一个类的方法的引用。也就是说,我想能够调用这个方法。这基本上是一种回调的方式。
我的代码在访问类的变量时出现了问题。当我运行下面的代码时,出现了错误。我哪里做错了呢?
布莱恩
import logging
class yRunMethod(object):
"""
container that allows method to be called when method run is called
"""
def __init__(self, method, *args):
"""
init
"""
self.logger = logging.getLogger('yRunMethod')
self.logger.debug('method <%s> and args <%s>'%(method, args))
self.method = method
self.args = args
def run(self):
"""
runs the method
"""
self.logger.debug('running with <%s> and <%s>'%(self.method,self.args))
#if have args sent to function
if self.args:
self.method.im_func(self.method, *self.args)
else:
self.method.im_func(self.method)
if __name__ == "__main__":
import sys
#create test class
class testClass(object):
"""
test class
"""
def __init__(self):
"""
init
"""
self.var = 'some var'
def doSomthing(self):
"""
"""
print 'do somthing called'
print 'self.var <%s>'%self.var
#test yRunMethod
met1 = testClass().doSomthing
run1 = yRunMethod(met1)
run1.run()
3 个回答
0
在你的代码中,你调用了 self.method.im_func(self.method)
。其实你不应该把方法本身当作参数传进去,而是应该传入这个方法所属的对象。也就是说,应该改成 self.method.im_func(self.method.im_self, *self.args)
。
0
为什么不使用这个:
self.method(*self.args)
而是使用这个:
if self.args:
self.method.im_func(self.method, *self.args)
else:
self.method.im_func(self.method)
11
我觉得你把这个问题想得太复杂了(这很常见哦;-)。在Python中,类和实例的方法是非常重要的对象。你可以像对待其他任何东西一样,随意传递和调用它们。深入研究一个方法的实例变量几乎是没必要的。为了实现你的目标,这里有一个简单的例子:
class Wrapper (object):
def __init__(self, meth, *args):
self.meth = meth
self.args = args
def runit(self):
self.meth(*self.args)
class Test (object):
def __init__(self, var):
self.var = var
def sayHello(self):
print "Hello! My name is: %s" % self.var
t = Test('FooBar')
w = Wrapper( t.sayHello )
w.runit()