У меня есть класс 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, чтобы я не увеличил количество ссылок? Мне нужна только слабая ссылка на объекты.