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