Python中的函数回调

0 投票
3 回答
1909 浏览
提问于 2025-04-18 18:17

我刚开始学习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等,都会出现同样的问题)。

有很多方法可以解决这个问题,但再次强调,没有一个完整的、可以编译的例子,很难给出具体的建议。

撰写回答