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

Txema Vicente txema en nabla.net
Lun Oct 21 18:48:17 CEST 2013


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/
>


------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20131021/2bf65651/attachment.html>


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