> 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 <tx...@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@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/ >> > _______________________________________________ > 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/