2011-08-01 37 views
10

我有一個EventManager類用C++編寫,並暴露到Python。這是我打算用於其被從Python側使用:(該add-remove-露出作爲EventManager靜態函數)Boost.Python的:回調類函數

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

與上面的代碼的問題是,所述回調被捕獲在boost::python::object實例內;當我做這些self.onFooEvent將增加self的引用計數,這將防止被刪除,所以析構函數不會被調用,因此事件處理程序永遠不會刪除(除非在應用程序的結束)。

的代碼非常適用於那些沒有一個self參數(即免費或靜態函數)的功能。我應該如何捕獲Python函數對象,以便我不會增加它們的引用計數?我只需要一個對象的弱引用。

+0

你不應該依賴於'反正__del__'。相反,公開一個常規方法來刪除事件處理程序。 (也許使它[上下文管理器(http://docs.python.org/library/stdtypes.html#context-manager-types)如果你看到像'X =東西(代碼);用(X);#從這一點x應該是未使用') – delnan

+0

@delnan但類似於「Something」類的對象將自己傳遞給另一個C++經理。當該經理不再需要他們時,它將刪除他們。我不認爲我可以在此背景下使用上下文管理器。 –

+0

哦,那麼不要再考慮上下文管理器的建議。儘管如此,而不是(或者除了)刪除它們,你應該告訴它們刪除它們的事件處理程序。否則,使內存管理變得更加智能的下一個補丁可能會讓你的代碼泄漏。 – delnan

回答

0

沒有weakref.ref(self.onFooEvent),你會不會把你的預期的行爲!看到我的評論。