Идиоматично ли Python использовать абстрактный класс для обратных вызовов обработчиков событий?

Я создаю структуру диспетчера событий, которая декодирует сообщения и вызывает обратно пользовательский код. Мой опыт работы с C++ предполагает, что я пишу :

class Handler:
    def onFoo(self):
        pass
    def onBar(self):
        pass

class Dispatcher:
    def __init__(self):
        self.handler = Handler()

    def run():
        while True:
            msg = decode_message() # magic
            if msg == 'foo':
                handler.onFoo()
            if msg == 'bar':
                handler.onBar()

. Тогда пользователь фреймворка напишет что-то вроде :

class MyHandler(Handler):
    def onFoo(self):
        do_something()

dispatcher = Dispatcher()
myHandler = MyHandler()
dispatcher.handler = myHandler
dispatcher.run()

. Но я также могу представить, что onFoo()и onBar()являются методами Dispatcherи позволяют пользователю заменить их другими методами. Тогда пользовательский код будет выглядеть как:

def onFoo():
    do_something()

dispatcher = Dispatcher()
dispatcher.onFoo = onFoo

Я также могу сделать Dispatcher.onFooсписок вызываемых объектов, чтобы пользователь мог прикрепить более одного обработчика, как в C #.

Какой самый питоновский способ сделать это?

5
задан japreiss 4 May 2012 в 21:11
поделиться