77from collections import defaultdict
88from inspect import signature
99from threading import Lock
10+ from types import MethodType
1011from typing import Any , Callable , Generic , cast
1112
1213from .basic_types import (
@@ -162,7 +163,12 @@ def subscribe(
162163 * ,
163164 keep_ref : bool = True ,
164165 ) -> Callable [[], None ]:
165- listener_ref = listener if keep_ref else weakref .ref (listener )
166+ if keep_ref :
167+ listener_ref = listener
168+ elif isinstance (listener , MethodType ):
169+ listener_ref = weakref .WeakMethod (listener )
170+ else :
171+ listener_ref = weakref .ref (listener )
166172
167173 listeners .add (listener_ref )
168174 return lambda : listeners .remove (listener_ref )
@@ -177,7 +183,12 @@ def subscribe_event(
177183 EventSubscriptionOptions () if options is None else options
178184 )
179185
180- handler_ref = handler if subscription_options .keep_ref else weakref .ref (handler )
186+ if subscription_options .keep_ref :
187+ handler_ref = handler
188+ elif isinstance (handler , MethodType ):
189+ handler_ref = weakref .WeakMethod (handler )
190+ else :
191+ handler_ref = weakref .ref (handler )
181192
182193 event_handlers [cast (type [Event ], event_type )].add (
183194 (handler_ref , subscription_options ),
@@ -284,7 +295,12 @@ def subscribe(
284295 | None = autorun_options .subscribers_immediate_run ,
285296 keep_ref : bool | None = autorun_options .subscribers_keep_ref ,
286297 ) -> Callable [[], None ]:
287- callback_ref = callback if keep_ref else weakref .ref (callback )
298+ if keep_ref :
299+ callback_ref = callback
300+ elif isinstance (callback , MethodType ):
301+ callback_ref = weakref .WeakMethod (callback )
302+ else :
303+ callback_ref = weakref .ref (callback )
288304 subscriptions .add (callback_ref )
289305
290306 if immediate_run :
0 commit comments