사용자 도구

사이트 도구


python:event_manager

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

다음 판
이전 판
python:event_manager [2016/02/01 06:40] – 만듦 rex8312python:event_manager [2024/03/23 02:42] (현재) – 바깥 편집 127.0.0.1
줄 1: 줄 1:
 ====== Python: Event Manager ====== ====== Python: Event Manager ======
  
-<code python> +<code python event_manager.py
-from threading import Timer+# -*-coding: utf-8 -*-
  
 +__author__ = 'rex8312'
  
-class Singleton(type): +import time
-    __instances = {}+
  
 +
 +class Singleton(type):
 +    _instances = {}
 + 
     def __call__(cls, *args, **kwargs):     def __call__(cls, *args, **kwargs):
-        if cls not in cls.__instances+        if cls not in cls._instances
-            cls.__instances[cls] = super(Singleton, cls).__call__(*args, **kwargs) +            cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs) 
-        return cls.__instances[cls]+        return cls._instances[cls]
  
  
-class Event(list): +class EventManager(metaclass=Singleton):
-    __metaclass__ = Singleton +
-    +
     def __init__(self):     def __init__(self):
-        super(Event, self).__init__() +        self.listeners = dict()
-        self.event_manager = None +
-        self.name = None+
  
-    def add_handler(self, handler): +    def register_listener(self, listener, event_type): 
-        self.append(handler+        self.listeners.setdefault(event_type, list()
-        return self+        self.listeners[event_type].append(listener)
  
-    def remove_handler(self, handler): +    def unregister_listener(self, listener, event_type): 
-        self.remove(handler) +        if event_type in self.listeners: 
-        return self+            self.listeners[event_type].remove(listener)
  
-    def fire(self, *args, **kwargs): +    def post(self, event): 
-        for handler in self+        event_type = type(event) 
-            handler(*args, **kwargs)+        listeners = self.listeners[event_type] 
 +        for listener in listeners
 +            listener(event)
  
-    __iadd__ = add_handler 
-    __isub__ = remove_handler 
-    __call__ = fire 
  
 +class TickEvent:
 +    def __init__(self):
 +        super().__init__()
 +        import random
 +        self.value = random.random()
  
-class EventManager(dict): + 
-    __metaclass__ = Singleton +class TickHandler: 
-    +    def notify(self, event): 
 +        print('tick', event.value) 
 +        EventManager().post(TockEvent()) 
 + 
 + 
 +class TockEvent:
     def __init__(self):     def __init__(self):
-        super(EventManager, self).__init__()+        super().__init__() 
 +        import random 
 +        self.value = random.random()
  
-    def __getattr__(self, event): 
-        return self[event] 
  
-    def __setattr__(self, event, value): +class TockHandler: 
-        self[event] = value+    def notify(self, event): 
 +        print('tock', event.value)
  
-    def register_event(self, name): 
-        self[name] = Event() 
-        self[name].name = name 
-        self[name].event_manager = self 
  
 +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()
  
-class Scheduler: 
-    @staticmethod 
-    def ticking(interval, func, iteration=0): 
-        if iteration != 1: 
-            Timer(interval, Scheduler.ticking, [interval, func, 0 if iteration == 0 else iteration - 1]).start() 
-        func() 
 </code> </code>
 +
 +{{tag>python "design pattern"}}
python/event_manager.1454308811.txt.gz · 마지막으로 수정됨: (바깥 편집)