Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как реализовать "слушателей" событий? 
:(
    Опции темы
redbaron
Дата 16.11.2006, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 16.11.2006

Репутация: нет
Всего: нет



Занялся изучением питона, и возникла такая проблема: одна программа генерирует события, а неограниченное число других (ввиде плагинов или просто в виде отдельных модулей) должны слушать эти события (не все , а только сами которые выберут) и реагировать на них. Как это реализовать? в C# есть delegate и event, а тут как провернуть такой трюк?

Для наглядности предсатвлю все упрощенно:

Код

import math
for i in range(100):
  if fmod(i,2)==0:
//событие один. тот кто его слушает должен получить значение i
  elif fmod(i,5)==0:
//событие два. тот кто его слушает должен получить номер итерации
  elif fmod(i,10)==0:
//событие три. тот кто его слушает не должен ничего получать, просто должен знать что событие случилось


задача: заранее неизвестное количество модулей должны "подписаться"  на заранее неизвестное количество событий и когда эти события происходят данные модули должны быть оповещены и им должны быть переданы соотв. данные. Причем те модули которые "подписаны" на событие 2 и  3 при никотором значении i должны быть "оповещены" дважды - по разу на каждое событие.

Светлые умы, подскажите плиз как решить такую задачку.

Впринципе "заранее неизвостное количество" это громко сказано, меня вполне устроит если "подключение" таких модулей будет сведено к добавлению одной строки вызова в основную программу.
PM MAIL   Вверх
Void
Дата 16.11.2006, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 10
Всего: 173



Функции в Питоне являются first class objects, так что изобразить подобное труда не составляет. Попытка эмуляции синтаксиса C#:
Код
class Event(object):
    def __init__(self):
        self.listeners = []
    
    def __call__(self, *args):
        for f in self.listeners:
            f(*args)
        
    def __iadd__(self, f):
        self.listeners.append(f)
        return self
    
    def __isub__(self, f):
        self.listeners.remove(f)
        return self


def listener1():
    print 'Listener #1'

def listener2(arg):
    print 'Listener #2 with argument = %s' % str(arg)

def listener3():
    print 'Listener #3'

def main():
    a1 = Event()
    a2 = Event()
    a1 += listener1
    a1 += listener3
    a2 += listener2
    a1()
    a2(5)
    a1 -= listener3
    a1()

if __name__ == '__main__':
    main()



--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Artemios
Дата 17.11.2006, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

Репутация: 18
Всего: 50



Эх, а я уж было хотел на Qt /SIGNAL/SLOT пример писать,а тут все красивее и средствами чистого Питона smile 


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.2065 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.