2011-08-01 4 views
10

EventManager 클래스는 C++로 작성되었으며 Python에 노출되어 있습니다. 이것은 그것이 파이썬 측에서 사용하는 I 의도 방법이다. (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 인수 (즉, 무료 또는 정적 함수)가없는 함수에 적합합니다. 레퍼런스 카운트를 증가시키지 않도록 파이썬 함수 객체를 어떻게 캡처해야합니까? 객체에 대한 약한 참조 만 필요합니다.

+0

어쨌든'__del__'에 의존해서는 안됩니다. 대신 이벤트 처리기를 제거하는 일반 메서드를 노출하십시오. (아마도 x = Something(); use (x); #와 같은 코드를 보게되면 [context manager] (http://docs.python.org/library/stdtypes.html#context-manager-types) x는이 시점에서 사용되지 않아야합니다 .') – delnan

+0

@delnan 그러나 'Something'과 비슷한 클래스의 객체는 다른 C++ 관리자에게 전달됩니다. 해당 관리자는 더 이상 필요하지 않으면 삭제합니다. 나는이 .. 맥락에서 컨텍스트 관리자를 사용할 수 있다고 생각하지 않는다. –

+0

오, 컨텍스트 관리자 제안을 무시하십시오. 그래도 삭제하는 대신 (또는 오히려 추가로) 이벤트 처리기를 제거하도록 지시해야합니다. 그렇지 않으면 메모리 관리를 더 스마트하게 만드는 다음 패치가 코드 유출을 초래할 수 있습니다. – delnan

답변

0

weakref.ref (self.onFooEvent)가 없으면 예상 한 동작을 얻지 못할 것입니다! 내 의견보기.