简体   繁体   中英

Boost.Python: Callbacks to class functions

I have an EventManager class written in C++ and exposed to Python. This is how I intended for it to be used from the Python side:

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

(The add- and remove- are exposed as static functions of EventManager .)

The problem with the above code is that the callbacks are captured inside boost::python::object instances; when I do self.onFooEvent these will increase the reference count of self , which will prevent it from being deleted, so the destructor never gets called, so the event handlers never get removed (except at the end of the application).

The code works well for functions that don't have a self argument (ie free or static functions). How should I capture Python function objects such that I won't increase their reference count? I only need a weak reference to the objects.

Without weakref.ref(self.onFooEvent) you will never get your expected behaviour! See my comment.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM