Python中的函数回调
我刚开始学习Python,遇到了一个问题。
我使用了一个带有“bind”方法的包,下面的代码可以正常工作:
def callback(data):
print data
channel.bind(callback)
但是当我试着把这段代码放进一个类里:
class myclass:
def callback(data):
print data
def register_callback:
channel.bind(self.callback)
结果是,call_back方法从来没有被调用。我试过用“self.callback”和直接用“callback”。有没有什么建议?
3 个回答
0
你所做的事情是完全可以实现的,但我不太确定你具体遇到了什么问题,因为你提供的示例代码连语法都不正确。(第二个方法根本没有参数列表。)
不管怎样,你可以参考下面的示例代码:
def send_data(callback):
callback('my_data')
def callback(data):
print 'Free function callback called with data:', data
# The follwing prints "Free function callback called with data: my_data"
send_data(callback)
class ClassWithCallback(object):
def callback(self, data):
print 'Object method callback called with data:', data
def apply_callback(self):
send_data(self.callback)
# The following prints "Object method callback called with data: my_data"
ClassWithCallback().apply_callback()
# Indeed, the following does the same
send_data(ClassWithCallback().callback)
在Python中,你可以在类似的情况下使用自由函数(上面例子中的callback
)或者绑定方法(上面例子中的self.callback
),至少对于你提到的这种简单任务来说是可以的。
0
你还需要把self这个对象传进去:
def register_callback(self):
channel.bind(self.callback)
1
我不太明白你的代码是怎么工作的,因为(1)你没有提供channel.bind的具体实现,和(2)你的第二个例子在定义register_callback时是错误的(它使用了一个self
参数,但这个参数并不在方法的参数列表中,而且缺少括号)。
不过,记住方法通常需要一个“self”参数,每次你运行self.function()
时,这个参数会自动传入,因为它在内部会被转换成一个函数调用,形式是function(self, ...)
。由于你的回调函数只有一个参数data
,这可能就是问题所在。
你不能声明一个bind
方法,让它既能接受一个函数,也能接受一个类的方法(在我知道的每种面向对象编程语言中,比如C++、Pascal等,都会出现同样的问题)。
有很多方法可以解决这个问题,但再次强调,没有一个完整的、可以编译的例子,很难给出具体的建议。