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.
george
User
Beiträge: 109
Registriert: Mittwoch 11. Januar 2006, 20:28
Wohnort: Berlin

eigenes Event erzeugen

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

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

Beitragvon mitsuhiko » 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

Beitragvon george » Freitag 24. Februar 2006, 16:12

Hallo blackbird,

ich danke dir. Genau so meinte ich es.

gruss george

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]