Tengo varios objetos de diferentes tipos (diferentes nombres de funciones, diferentes firmas) y los ajusto para tener una forma común de acceder a ellos desde diferentes funciones. En resumen, hay un despachador que toma los objetos que quiero parchar y, dependiendo del tipo de objeto, llama a un parche diferente. Un parche añadirá métodos para el objeto:Agregando clase base al objeto existente en python
def patcher_of_some_type(object):
def target(self, value):
# do something and call self methods
object.target = types.MethodType(target, object)
# many more of these
A medida que el programa crece más complicado hacer una envoltura alrededor del objeto (o la clase de objeto) parece ser mejor idea. Algunos parches comparten un código común o están interrelacionados. Pero no controlo la creación de objetos, ni la creación de clases. Solo obtengo los objetos. E incluso si pudiera hacer eso, solo quiero envolver (o parchar) ciertos objetos, no todos.
Una solución podría ser agregar una clase base a un objeto existente, pero no estoy seguro de cuán sostenible y segura es esta. ¿Hay alguna otra solución?
Así que la las clases no están definidas de usted? – dav1d
No, las clases están definidas en una biblioteca que no controlo. Podría crear wrappers de todas las clases, pero esto solo funcionará para los objetos que instalé, no para los creados por la biblioteca. Si parcheo la biblioteca, sucede lo contrario: todos los objetos están parcheados y solo quiero parchar algunos de ellos. Finalmente, si envuelvo algunos objetos, necesitaría mantener mi propia estructura de datos para referirme a ellos. Es por eso que ahora estoy parcheando los objetos que quiero. – Hernan
Definiría una clase contenedora para contener los objetos. La necesidad de tener diferentes tipos de envoltorios que comparten un código común se puede manejar teniendo una clase de envoltura base y obteniendo versiones especializadas de ella. Cosas básicas de OOP ... – martineau