Boost.Python:调用类函数的回调

10 投票
1 回答
818 浏览
提问于 2025-04-16 22:39

我有一个用C++写的EventManager类,并且这个类可以在Python中使用。我希望它在Python中的使用方式是这样的:

class Something:
    def __init__(self):
        EventManager.addEventHandler(FooEvent, self.onFooEvent)
    def __del__(self):
        EventManager.removeEventHandler(FooEvent, self.onFooEvent)
    def onFooEvent(self, event):
        pass

add-remove-被作为EventManager的静态函数提供。)

上面的代码有个问题,就是回调函数被保存在boost::python::object实例里面;当我调用self.onFooEvent时,这会增加self的引用计数,这样就会导致self无法被删除,所以析构函数永远不会被调用,事件处理器也不会被移除(除了在程序结束时)。

对于没有self参数的函数(也就是自由函数或静态函数),代码运行得很好。我应该如何捕获Python的函数对象,以避免增加它们的引用计数呢?我只需要对这些对象的弱引用。

1 个回答

0

如果没有使用 weakref.ref(self.onFooEvent),你就永远无法得到你想要的效果!看看我的评论。

撰写回答