python:event_manager
Python: Event Manager
- event_manager.py
# -*-coding: utf-8 -*- __author__ = 'rex8312' import time class Singleton(type): _instances = {} def __call__(cls, *args, **kwargs): if cls not in cls._instances: cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs) return cls._instances[cls] class EventManager(metaclass=Singleton): def __init__(self): self.listeners = dict() def register_listener(self, listener, event_type): self.listeners.setdefault(event_type, list()) self.listeners[event_type].append(listener) def unregister_listener(self, listener, event_type): if event_type in self.listeners: self.listeners[event_type].remove(listener) def post(self, event): event_type = type(event) listeners = self.listeners[event_type] for listener in listeners: listener(event) class TickEvent: def __init__(self): super().__init__() import random self.value = random.random() class TickHandler: def notify(self, event): print('tick', event.value) EventManager().post(TockEvent()) class TockEvent: def __init__(self): super().__init__() import random self.value = random.random() class TockHandler: def notify(self, event): print('tock', event.value) class CPUSpinner(object): def run(self): while True: EventManager().post(TickEvent()) time.sleep(1) if __name__ == '__main__': EventManager().register_listener(TickHandler().notify, TickEvent) EventManager().register_listener(TockHandler().notify, TockEvent) CPUSpinner().run()
python/event_manager.txt · 마지막으로 수정됨: 2024/03/23 02:42 저자 127.0.0.1