You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

80 lines
2.1 KiB

listener = {}
def listen(EventClass, *args):
def wrap(f):
if isinstance(EventClass, type) \
and issubclass(EventClass, Event) \
and EventClass != Event:
if not EventClass.__name__ in listener:
listener[EventClass.__name__] = []
listener[EventClass.__name__].append((f, args))
# next step allow us to call the function itself without Event raised
def wrapped_f(*args):
f(*args)
return wrapped_f
else:
raise IOError('{} is not an Event subclass'.format(EventClass))
return wrap
class Event(object):
def __init__(self, string):
"""This is an example of simple event that can be raised
Inherit from this class and redefine whatever you need,
except the send funtion
"""
self.string = string
def send(self):
""" This function send the instance of the class, i.e. the event to be sent,
to all function that listen to it
"""
if self.__class__.__name__ in listener:
for f, args in listener[self.__class__.__name__]:
f(self, *args)
if __name__ == "__main__":
class TestEvent(Event):
def print_one(self):
print 'one'
@listen(TestEvent, 12, 15)
def Display(TestEventInstance, nb1, nb2):
print TestEventInstance.string, nb1, nb2
@listen(TestEvent)
def Helloword(TestEventInstance):
print 'Helloword'
@listen(TestEvent)
def PrintIt(TestEventInstance):
TestEventInstance.print_one()
class AddEvent(Event):
def __init__(self):
pass
def add(self, a, b):
return a + b
@listen(AddEvent)
def DoIt(AddEventInstance):
print AddEventInstance.add(17, 25)
# using the callback system
myevent = TestEvent('abcdefghijklmnopqrstuvwxyz')
myevent.send() # this one call three function
addevent = AddEvent()
addevent.send()
# but also work without the event raising system!
Display(myevent, 12, 15)
Helloword(myevent)
PrintIt(myevent)
DoIt(addevent)