Я создаю структуру диспетчера событий, которая декодирует сообщения и вызывает обратно пользовательский код. Мой опыт работы с 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 #.
Какой самый питоновский способ сделать это?