Advertisement
BetterBuiltFool

event_listener_minimal

Apr 9th, 2025
18
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.43 KB | None | 0 0
  1. from __future__ import annotations
  2.  
  3. from collections.abc import Callable
  4. from typing import TypeVar
  5. from weakref import proxy, ref, WeakSet
  6.  
  7.  
  8. T = TypeVar("T")
  9.  
  10.  
  11. def weaken_closures(listener: Callable) -> Callable:
  12.     if listener.__closure__ is None:
  13.         return listener
  14.  
  15.     for cell in listener.__closure__:
  16.         contents = cell.cell_contents
  17.         cell.cell_contents = proxy(contents)
  18.  
  19.     return listener
  20.  
  21.  
  22. class Event:
  23.  
  24.     def __init__(self, instance: T) -> None:
  25.         self._instance = ref(instance)
  26.         self.listeners: WeakSet[Callable] = WeakSet()
  27.  
  28.     def add_listener(self, listener: Callable) -> Callable:
  29.         self.listeners.add(weaken_closures(listener))
  30.         return listener
  31.    
  32.     def notify(self):
  33.         for listener in self.listeners:
  34.             listener()
  35.  
  36. class Bar:
  37.     def __init__(self):
  38.         self.Event = Event(self)
  39.  
  40. bar = Bar()
  41.  
  42. class Foo:
  43.    
  44.     def __init__(self):
  45.        
  46.         print("'self' before the closure:")
  47.         print(self)
  48.         print(type(self))
  49.        
  50.         @bar.Event.add_listener
  51.         def baz():
  52.             # This runs when Event is called
  53.             print("'self' within the closure:")
  54.             print(self)
  55.             print(type(self))
  56.        
  57.         self.listeners = baz
  58.        
  59.         print("'self' after the closure:")
  60.         print(self)
  61.         print(type(self))
  62.  
  63. foo = Foo()
  64.  
  65. bar.Event.notify()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement