Boost.Python: обратные вызовы для функций класса

У меня есть класс 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 (т.е. свободных или статических функций). Как мне захватить объекты функции Python, чтобы я не увеличил количество ссылок? Мне нужна только слабая ссылка на объекты.

Ответ 1

Без weakref.ref(self.onFooEvent) вы никогда не получите ожидаемое поведение! См. Мой комментарий.