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