1 #C#-Style Events in Python
2 #Taken from http://code.activestate.com/recipes/410686/
6 def __getattr__(self, name):
7 if hasattr(self.__class__, '__events__'):
8 assert name in self.__class__.__events__, \
9 "Event '%s' is not declared" % name
10 self.__dict__[name] = ev = _EventSlot(name)
12 def __repr__(self): return 'Events' + str(list(self))
14 def __len__(self): return NotImplemented
16 def gen(dictitems=self.__dict__.items()):
17 for attr, val in dictitems:
18 if isinstance(val, _EventSlot):
22 #------------------------------------------------------------------------------
25 def __init__(self, name):
29 return 'event ' + self.__name__
30 def __call__(self, *a, **kw):
31 for f in self.targets: f(*a, **kw)
32 def __iadd__(self, f):
33 self.targets.append(f)
35 def __isub__(self, f):
36 while f in self.targets: self.targets.remove(f)
39 #------------------------------------------------------------------------------
41 if __name__ == '__main__':
43 class MyEvents(Events):
44 __events__ = ('OnChange', )
46 class ValueModel(object):
48 self.events = MyEvents()
50 def __set(self, value):
51 if (self.__value == value): return
53 self.events.OnChange()
54 ##self.events.OnChange2() # would fail
57 Value = property(__get, __set, None, 'The actual value')
59 class SillyView(object):
60 def __init__(self, model):
62 model.events.OnChange += self.DisplayValue
63 ##model.events.OnChange2 += self.DisplayValue # would raise exeception
64 def DisplayValue(self):
65 print self.model.Value
69 view = SillyView(model)
71 print '\n--- Events Demo ---'
75 # Events introspection
77 for event in model.events: