In this code, I use weakref.WeakMethod for creation autodelete listeners of observable object. And if listeners is method of unhashable obejct, this let to TypeError: unhashable type
, but why WeakMethod
don’t use hash of method? After all, the methods of different objects have different hash even objects unhashable.
import weakref
class Observable:
def __init__(self):
self._listeners = set()
def register(self, listener):
self._listeners.add(listener)
class A:
def __init__(self, obs: Observable):
weak_listener = weakref.WeakMethod(self._listener)
obs.register(weak_listener)
def _listener(self):
pass
class B(list): # Unhashable type, list only for example
def __init__(self, obs: Observable):
super().__init__()
weak_listener = weakref.WeakMethod(self._listener)
obs.register(weak_listener)
def _listener(self):
pass
class C(list): # Unhashable type, list only for example add hash for example
def __init__(self, obs: Observable):
super().__init__()
weak_listener = weakref.WeakMethod(self._listener)
obs.register(weak_listener)
def _listener(self):
pass
def __hash__(self):
return hash((self._listener,))
if __name__ == '__main__':
obs = Observable()
a = A(obs) # Correct
b = B(obs) # TypeError: unhashable type: 'B'
c = C(obs) # Correct