Estoy creando un marco de distribución de eventos que descodifica mensajes y vuelve a llamar al código de usuario. Mi C++ fondo sugiere que escribo:¿Es idiomático Python usar una clase abstracta para callbacks de controladores de eventos?
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()
continuación, el usuario marco podría escribir algo como:
class MyHandler(Handler):
def onFoo(self):
do_something()
dispatcher = Dispatcher()
myHandler = MyHandler()
dispatcher.handler = myHandler
dispatcher.run()
Pero también se puede imaginar poniendo onFoo()
y onBar()
como métodos de Dispatcher
y dejar que el usuario reemplazarlos con otros métodos. A continuación, el código de usuario se vería así:
def onFoo():
do_something()
dispatcher = Dispatcher()
dispatcher.onFoo = onFoo
yo también podría hacer una lista de Dispatcher.onFoo
callables, por lo que el usuario puede adjuntar más de un manejador como en C#.
¿Cuál es la forma más pitonica de hacerlo?
¿Por qué está creando un marco de despachador de eventos? Ya existen muchos. – Marcin
No estoy construyendo nada de propósito general: probablemente hice que el proyecto parezca más grande de lo que realmente es. Es solo una capa de mensajería que decodifica los mensajes de Buffers de Protocolo y llama a las funciones apropiadas. – japreiss
Para expandir un poco más: quiero evitar depender demasiado de las bibliotecas de terceros, ya que he encontrado algunos problemas para integrarlos en la gran base de código propietario de mi empresa. Quiero mantener la posibilidad de arrancar las bibliotecas y reemplazarlas con el código de Invented Here. – japreiss