eigenes Event erzeugen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
george
User
Beiträge: 109
Registriert: Mittwoch 11. Januar 2006, 20:28
Wohnort: Berlin

Freitag 24. Februar 2006, 14:54

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
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Freitag 24. Februar 2006, 16:04

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 :)
TUFKAB – the user formerly known as blackbird
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Freitag 24. Februar 2006, 16:05

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!!!
TUFKAB – the user formerly known as blackbird
george
User
Beiträge: 109
Registriert: Mittwoch 11. Januar 2006, 20:28
Wohnort: Berlin

Freitag 24. Februar 2006, 16:12

Hallo blackbird,

ich danke dir. Genau so meinte ich es.

gruss george
Antworten