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)
Комментариев нет:
Отправить комментарий