вторник, 24 января 2012 г.

Шаблон реализации события на Python

Ещё раз убеждаюсь, что на питоне достаточно всё просто и прозрачно. Это ни в коем случае не недостаток, это большой плюс. Хотите сложнее, всё в ваших руках. Вы лично можете прочувствовать код. К примеру, всё можно сделать очень просто, но для более сложных ситуаций необходимо делать хитрее. Для этого и необходимо набираться знаний использования различных паттернов. Дальше описывается паттерн использования событий. В простой ситуации можно обойтийсь объявлением метода-событие в рабочем классе и после инициализации класса, переопределить метод нужным. Да это просто, но это только начало. Событие — это набор функций,  которые будут вызваны при вызове события, смотря, на реализацию кода. Смысловая нагрузка заключается в следующем: клиенты подписчики, подписываются на данное событие, к данному событию добавляется метод который должен будет вызываться. При возникновении события, менеджер событий вызывает методы подписчиков, все подписчики стают уведомлеены о происшествии события. Становиться видно из данного кода. Чистый код, лучше длинных статтей.

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()

Комментариев нет:

Отправить комментарий