Hola
como lo que pregunta es si la práctica está extendida, le voy a
responder con mi práctica.
Normalmente no creo un decorador para esto. Supongamos que tengo una
clase A que
ofrece un servicio mi_servicio (un método) y una clase B que desea usar
el servicio
que ofrece A (no es una herencia, sino una composición). En este caso
yo en la clase B escribo
una declaración de la misma función con el mismo nombre, los mismos
parámetros, las mismas
anotaciones (si usas Python 3.x) solo que le pongo en el cuerpo "raise
NotImplementedError()" y en la
documentación indico que debe ser un método compatible con
"A.mi_servicio" fijense que digo compatible, aqui dejo
abierta la posibilidad para muchas cosas.
De esta forma indico que B consume un servicio pero que no lo
implementa esta clase. A la hora de usar B simplemente creo
el objeto de la clase B e inyecto una implementación para el método
mi_servicio.
Codigo de Ejemplo:
###################################
class A:
def mi_servicio(self):
print("servicio que imprime un mensaje en pantalla")
class B:
def mi_servicio(self):
"""
Como implementacion de este metodo puede usarse A.mi_servicio o
cualquier otro compatible.
"""
raise NotImplementedError()
# luego cuando deseo usar B
a = A()
b = B()
b.mi_servicio = a.mi_servicio
##################################
La ultima parte de creación del objeto b e inyección de dependencias lo
hago utilizando una
librería de inyección de dependencias sencilla de solo dos funciones
(inject() y create_descriptor())
En el ejemplo de arriba se asume que mi_servicio es opcional para B, en
caso de ser requerido lo
adiciono como un argumento de inicialización de la clase B y paso
a.mi_servicio como argumento del
constructor.
Espero comprendas que inyección de dependencias no quiere decir emplear
un contenedor, ni una librería,
sino dejar bien claro quien requiere algo que lo ofrece otro.
Atentamente
--
Ing. Yeiniel Suárez Sosa
Profesor Instructor, Dep. Automática
FIE, UCLV
On 2013-10-21 09:37, Ander Garmendia wrote:
Buenas,
estoy 'jugando' con decoradores y haciendo diferentes pruebas y tengo
una duda que quizá alguien me pueda aclarar.
Digamos que tenemos una clase ( llamemosla B ) a la que queremos
añadir una funcionalidad (llamemosla F). El método clásico sería
heredar desde la clase base ( B ) y crear una nueva clase (
llamemosla
C ) que implementase nuestra funcionalidad ( F ). Hasta aquí todo
normal y corriente.
Ahora llega python y nos ofrece los decoradores, por lo tanto,
podemos
crear una clase decoradora ( llamemosla D ) que implemente la
funcionalidad ( F ) y que decorando una clase ( volvamos a la clase B
), añade la funcionalidad F en la clase B sin necesidad de herencias
de ningún tipo.
Visto así, todo parece muy cómodo, se escribe menos código, hay menos
clases implicadas, etc.
Y como todo parece muy bonito, aquí surge mi duda: ¿Está esta
practica
extendida al escribir código en python ( es pythonico y aceptable ) ?
¿ o es mas una prueba conceptual ?
Gracias de antemano y un saludo.
Ander.
_______________________________________________
Python-es mailing list
Python-es@python.org
https://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/
_______________________________________________
Python-es mailing list
Python-es@python.org
https://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/