[Python-es] ¿ Injección de código con decoradores o herencia ?

Hernan M. F. hfoffani en gmail.com
Mar Oct 22 10:14:33 CEST 2013


> gracias a todos por el interes. Creo que me ha quedado bastante claro el asunto.
> 
> - Yeiniel me ha gustado tu solución, solo que yo la utilizaría con la
> sintaxis que ha utilizado Juan.
> - Sergio, no estoy intentando resolver ningún problema, solamente
> estoy "jugando" con los decoradores y viendo de lo que son capaces. Y
> mi pregunta surge desde ese interes.
> - Y enlazando la frase anterior, gracias Txema por tu post, ya que
> bien explicas para que son bueno los decoradores y para que no.

Ten cuidado cuando cambies el comportamiento de objetos al vuelo.

Si vas a componer clases ¿por qué complicarse?. Usa lo estándar:
  class C (B):
     def __init__(self):
        self._f_provider = D()
     def F(self):
        self._f_provider.F()

Tampoco estás obligado a definir una clase y usar métodos, esto no es Java.
F() podría ser un procedimiento o función de un módulo.

Con la herencia múltiple de Python (que a veces se nos olvida que tiene), sería:
'class C (B,D)' y no tienes que hacer mas nada. Eso sí, te compras otros ocho mil
problemas nuevos…

Y si el problema y el marco de la solución lo merece lo mas formal es usar abc.

Keep it simple. ;-)

> 
> El día 21 de octubre de 2013 18:48, Txema Vicente <txema en nabla.net> escribió:
>> Buenas.
>> 
>> Aunque puedas usar decoradores para ampliar la clase que decoran, yo no veo
>> los decoradores como sustitutos de la herencia, ni ninguna reduccion de
>> codigo.
>> 
>> No necesitas decoradores para hacer eso, puedes asignar una funcion a un
>> atributo de la clase (B.F = F). Ademas, como te pongas a crear clases
>> decoradas que se amplian en ejecucion, a ver como lo explicas luego.
>> 
>> Los decoradores vienen bien, por ejemplo, para "enchufar" funciones que van
>> a manejar algo, como funciones que van a tratar los eventos de un GUI, o
>> responder en una ruta URL @ruta("/admin"). Dependiendo de lo que quieras
>> hacer, sera con una funcion o con una clase, con argumentos o sin ellos.
>> 
>> Tambien tienes el decorador @classmethod por si quieres crear clases que
>> puedan tener casos particulares (miclase = B.ampliada_con_F()), o actuar
>> como "factoria" de clases.
>> Y @staticmethod, que yo solo lo uso en raras ocasiones por motivos de
>> organizacion de API.
>> 
>> La herencia es algo claro y maravilloso que te permite organizar las cosas.
>> El decorador es un "atajo del idioma" para trastear con las funciones, no
>> hay nada que realmente no puedas hacer sin usarlo.
>> 
>> 
>> El 21/10/2013 15:37, Ander Garmendia escribió:
>> 
>> 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 en python.org
>> https://mail.python.org/mailman/listinfo/python-es
>> FAQ: http://python-es-faq.wikidot.com/
>> 
>> 
>> 
>> 
>> _______________________________________________
>> Python-es mailing list
>> Python-es en python.org
>> https://mail.python.org/mailman/listinfo/python-es
>> FAQ: http://python-es-faq.wikidot.com/
>> 
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> https://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/



Más información sobre la lista de distribución Python-es