Me gustaría proporcionar la capacidad para que los usuarios de uno de mis módulos amplíen sus capacidades al proporcionar una interfaz para llamar a la función de un usuario. Por ejemplo, quiero dar a los usuarios la capacidad de recibir notificaciones cuando se crea una instancia de una clase y se les da la oportunidad de modificar la instancia antes de que se use.¿Cuál es la forma preferida de implementar un enlace o devolución de llamada en Python?
La forma en vez implementado es declarar una función de fábrica de nivel de módulo que hace la creación de instancias:
# in mymodule.py
def factory(cls, *args, **kwargs):
return cls(*args, **kwargs)
Entonces cuando necesito una instancia de una clase en mimodulo, hago factory(cls, arg1, arg2)
en lugar de cls(arg1, arg2)
.
extenderlo, un programador podría escribir en otro módulo de una función como esta:
def myFactory(cls, *args, **kwargs):
instance = myFactory.chain(cls, *args, **kwargs)
# do something with the instance here if desired
return instance
Instalación de la devolución de llamada citadas es el siguiente:
myFactory.chain, mymodule.factory = mymodule.factory, myFactory
Esto parece suficientemente claro para mí, pero me preguntaba si usted, como programador de Python, esperaría que una función registre una devolución de llamada en lugar de hacerlo con una tarea, o si hubiera otros métodos que podría esperar. ¿Mi solución parece funcional, idiomática y clara para ti?
Estoy buscando que sea lo más simple posible; No creo que la mayoría de las aplicaciones deban encadenar más de una devolución de llamada de un usuario, por ejemplo (aunque el encadenamiento ilimitado es "gratis" con el patrón anterior). Dudo que necesiten eliminar devoluciones de llamada o especificar prioridades u orden. Los módulos como python-callbacks o PyDispatcher me parecen exagerados, especialmente este último, pero si hay beneficios convincentes para un programador que trabaja con mi módulo, estoy abierto a ellos.
¿Qué hay de malo en usar una subclase simple para extender una clase? ¿Por qué toda esta confusión llamada call back? –