Seite 1 von 1
eigenes Event erzeugen
Verfasst: Freitag 24. Februar 2006, 14:54
von george
Hallo,
ist es möglich, in einer Klasse ein eigenes Event zu definieren??
Pseudo-Code
Code: Alles auswählen
class mdlClassA:
myEvent(...)
#Event auslösen
class mdlClassB:
objClassA = mdlClassA.mdlClassA()
#Event aus dem mdlClassA binden
#Eventhandler zum Event aus mdlClassA
def OnEvent(self, event):
#stuff
Danke
gruss george
Verfasst: Freitag 24. Februar 2006, 16:04
von mitsuhiko
Klar:
Code: Alles auswählen
class EventManager(type):
db = {}
def __new__(cls, name, bases, d):
event = type.__new__(cls, name, bases, d)
event_type = bases[0]
if not event_type is object and not event_type is Event:
if not event_type in EventManager.db:
EventManager.db[event_type] = []
EventManager.db[event_type].append(event)
return event
class EventCollection(object):
def __init__(self, event_type, attr):
self.event_type = event_type
self.attr = attr
def __call__(self, *args, **kwargs):
for event in EventManager.db.get(self.event_type, []):
getattr(event(), self.attr)(*args, **kwargs)
class ExtensionPoint(object):
def __init__(self, event_type):
self.event_type = event_type
def __getattr__(self, attr):
handler = 'on_%s' % attr
def proxy(*args, **kwargs):
for event in EventManager.db.get(self.event_type, []):
getattr(event(), handler)(*args, **kwargs)
if hasattr(self.event_type, handler):
return proxy
class Event(object):
__metaclass__ = EventManager
Nutzen kannst du es so:
Code: Alles auswählen
class TestEvent(Event):
def on_test_call(self, name):
"""gets called from the application."""
class NameOutput(TestEvent):
def on_test_call(self, name):
print "Your name is", name
class NameTest(TestEvent):
def on_test_call(self, name):
if name == 'foobar':
print 'This is NOT a name!!!'
class Application(object):
some_events = ExtensionPoint(TestEvent)
def __init__(self):
pass
def run(self):
name = raw_input("Enter your name: ")
self.some_events.test_call(name)
app = Application()
app.run()
Have fun

Verfasst: Freitag 24. Februar 2006, 16:05
von mitsuhiko
Und so schaut das aus:
Code: Alles auswählen
blackbird@volverine:~/Developement/area51/events$ python events.py
Enter your name: Peter
Your name is Peter
blackbird@volverine:~/Developement/area51/events$ python events.py
Enter your name: foobar
Your name is foobar
This is NOT a name!!!
Verfasst: Freitag 24. Februar 2006, 16:12
von george
Hallo blackbird,
ich danke dir. Genau so meinte ich es.
gruss george