|
查看: 979|回复: 0
|
Implement event in Python
[复制链接]
|
|
|
Implement event in Python, here is the code. Simple right ?
import sys
def _functionId(obj, nFramesUp):
""" Create a string naming the function n frames up on the stack. """
fr = sys._getframe(nFramesUp+1)
co = fr.f_code
return "%s.%s" % (obj.__class__, co.co_name)
def abstractMethod(obj=None):
""" Use this instead of 'pass' for the body of abstract methods. """
raise Exception("Unimplemented abstract method: %s" % _functionId(obj, 1))
# Interface class ( not really interface, cause python dont support interface yet)
class IEventListener:
def fire(self, *args, **kargs):
""" fire event """
abstractMethod(self)
def perform(self, *args, **kargs):
""" perform task """
abstractMethod(self)
#Singleton base class
class Singleton(object):
_instance = None
def __new__(cls, *args, **kwargs):
if '_inst' not in vars(cls):
cls._inst = object.__new__(cls, *args, **kwargs)
return cls._inst
# Event class need to be singleton, act like manager here
class Event(Singleton):
def __init__(self):
print "event init..."
if self._instance ==None:
self._instance =1
self.handlers = set()
def handle(self, handler):
self.handlers.add(handler)
def unhandle(self, handler):
try:
self.handlers.remove(handler)
except:
raise ValueError("Handler is not handling this event, so cannot unhandle it."
def fire(self, *args, **kargs):
self.perform( *args, **kargs)
def perform(self, *args, **kargs):
for handler in self.handlers:
handler.fire(*args, **kargs)
def getHandlerCount(self):
return len(self.handlers)
__iadd__ = handle
__isub__ = unhandle
__call__ = fire
__len__ = getHandlerCount
#Some sample Listener class
class Literner1(IEventListener):
def __init__(self):
Event().handle(self) # Subcribe to event manager, any event, please notify me...
#event manage will trigger this is any event fired.
def fire(self, *args, **kargs):
self.perform( *args, **kargs)
def perform(self, *args, **kargs):
print " erform event in listener 1"
#Sample listener 2
class Literner2(IEventListener):
def __init__(self):
Event().handle(self)
def fire(self, *args, **kargs):
self.perform( *args, **kargs)
def perform(self, *args, **kargs):
print " erform event in listener 2"
if __name__=='__main__':
e1 =Event()
e2= Event()
l1 = Literner1()
l2 = Literner2()
e1.fire("1"
e2.fire("1" # e1 and e2 are the same instance. |
|
|
|
|
|
|
|
|
| |
本周最热论坛帖子
|