class Event:
def __init__(self):
'''
Конструктор.
'''
#Методы конструктора
self.handlers = set()
def handle(self, handler):
'''
Реализация подписки.
'''
#Добавление функций оповещения.
self.handlers.add(handler)
return self
def unhandle(self, handler):
'''
Удаление функции оповещения
'''
try:
self.handlers.remove(handler)
except:
raise ValueError("Handler is not handling this event, so cannot unhandle it.")
return self
def fire(self, *args, **kargs):
'''
- Выполнение оповещения клиентов, исполнение функций
прикреплённых к событию.
'''
for handler in self.handlers:
handler(*args, **kargs)
def getHandlerCount(self):
'''
Возращает количество функций оповещения.
'''
return len(self.handlers)
'''
Переопределяем системные функции,
которые помогают нам переопределить логику
работы с операторами и другими стандартными функциями
'''
#Добавление
__iadd__ = handle
#Отнимание
__isub__ = unhandle
#Вызов
__call__ = fire
#Использование функции len.
__len__ = getHandlerCount
class MockFileWatcher:
'''
Пример использование.
'''
def __init__(self):
#Определяем событие
self.fileChanged = Event()
def watchFiles(self):
#Главная функция, в которой происходит событие.
source_path = "foo"
#Инициация события.
self.fileChanged(source_path)
def log_file_change(source_path):
'''
Событие №1.
'''
print "%r changed." % (source_path,)
def log_file_change2(source_path):
'''
Событие №2.
'''
print "%r changed!" % (source_path,)
#Создание рабочего класса.
watcher = MockFileWatcher()
#Добавление функций оповещения подписчиков.
watcher.fileChanged += log_file_change2
watcher.fileChanged += log_file_change
watcher.fileChanged -= log_file_change2
#Выполнение бизнес логики, в которой должно произойти данное событие.
watcher.watchFiles()
вторник, 24 января 2012 г.
Шаблон реализации события на Python
Ещё раз убеждаюсь, что на питоне достаточно всё просто и прозрачно. Это ни в коем случае не недостаток, это большой плюс. Хотите сложнее, всё в ваших руках. Вы лично можете прочувствовать код. К примеру, всё можно сделать очень просто, но для более сложных ситуаций необходимо делать хитрее. Для этого и необходимо набираться знаний использования различных паттернов. Дальше описывается паттерн использования событий. В простой ситуации можно обойтийсь объявлением метода-событие в рабочем классе и после инициализации класса, переопределить метод нужным. Да это просто, но это только начало. Событие — это набор функций, которые будут вызваны при вызове события, смотря, на реализацию кода. Смысловая нагрузка заключается в следующем: клиенты подписчики, подписываются на данное событие, к данному событию добавляется метод который должен будет вызываться. При возникновении события, менеджер событий вызывает методы подписчиков, все подписчики стают уведомлеены о происшествии события. Становиться видно из данного кода. Чистый код, лучше длинных статтей.
Подписаться на:
Комментарии к сообщению (Atom)
Комментариев нет:
Отправить комментарий