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

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

10
задан Paul Manta 1 August 2011 в 14:26
поделиться