Regístrate para acceder a más de 15 cursos gratuitos de programación con un simulador

Decorador (Patrón de diseño) Python: Polimorfismo

A menudo necesitamos agregar funcionalidades a un objeto sin modificar su estructura interna. Por ejemplo, si ya tenemos una clase que representa un comentario en un blog, podríamos querer agregarle filtros, auditoría o traducción automática.

Modificar la clase directamente podría generar problemas y romper lo que ya funciona. La solución es el patrón de diseño*Decorador*, que permite extender la funcionalidad de un objeto sin alterarlo.


¿Qué es el patrón Decorador?

Nos permite agregar comportamiento adicional a un objeto, sin modificar su código original. Lo que hace es “envolver” el objeto y ampliarlo. Y lo mejor: las demás partes del código pueden seguir usando ese objeto como si nada hubiera cambiado.

Caso práctico: comentarios en un blog

Vamos a imaginar que estamos desarrollando el sistema de comentarios de un blog. 🎯 Nuestra meta: filtrar ciertos comentarios inadecuados, pero sin cambiar el código base de la clase que los maneja.

Aquí te explicamos paso a paso cómo hacerlo:

1. Creamos la clase básica Comment

Este será nuestro objeto original. Solo mostrará el texto de un comentario.

class Comment:
    def __init__(self, text):
        self.text = text

    def display(self):
        return self.text

✅ Hasta aquí solo tenemos lo básico: una clase con un método display() que devuelve el texto. No hay ningún filtro ni modificación.

2. Agregamos un decorador para filtrar groserías

Vamos a crear un decorador llamado ProfanityFilterDecorator. Esta clase va a envolver el comentario original y reemplazar las groserías por asteriscos (***), sin cambiar el texto original del Comment.

class ProfanityFilterDecorator:
    def __init__(self, comment):
        self.comment = comment
        self.profanities = {"badword1", "badword2"}  # lista de palabras no deseadas

    def display(self):
        # Obtener el texto del comentario original
        words = self.comment.display().split()
        # Si la palabra está en la lista, la reemplazamos con ***
        result_words = [word if word not in self.profanities else "***" for word in words]
        return " ".join(result_words)

Usamos una lista para simular palabras "prohibidas" y reemplazamos cualquier coincidencia por ***.

3. Usamos el decorador en la práctica

Probemos cómo funciona en código real:

# Creamos un comentario normal
comment = Comment("This is a comment with a badword1")

# Mostramos el comentario sin filtro
print(comment.display())
# Resultado: This is a comment with a badword1

# Aplicamos el decorador
filtered_comment = ProfanityFilterDecorator(comment)

# Mostramos el comentario con filtro
print(filtered_comment.display())
# Resultado: This is a comment with a ***

Fíjate que filtered_comment se comporta igual que un Comment, pero ahora tiene un comportamiento adicional. Eso es precisamente lo que hace el patrón Decorador.


¿Puedo encadenar decoradores?

¡Claro! Puedes tener múltiples decoradores uno encima del otro.

Por ejemplo, podrías crear otro decorador que traduzca el comentario. Y luego usarlo así:

comment = Comment("This is a comment with a badword1")
filtered = ProfanityFilterDecorator(comment)
translated = TranslationDecorator(filtered)  # suponiendo que existe este decorador

Esto es súper útil cuando queremos agregar funcionalidades de manera modular, reutilizable y sin tocar el código original.


Ventajas y desventajas del patrón Decorador

Ventajas Desventajas
Permite agregar funcionalidades sin modificar código existente Muchos decoradores pueden hacer el código difícil de seguir
Reutilizable y flexible El comportamiento puede volverse "oculto"
Sigue principios SOLID



Resumen

  • El patrón Decorador permite añadir funcionalidad a objetos sin modificar su estructura. Se logra envolviendo un objeto dentro de otro, que comparte el mismo interfaz
  • Es útil para mantener el código limpio y seguir los principios de diseño como SOLID.
  • En Python, los decoradores se pueden implementar como clases o funciones.
  • Los decoradores se pueden encadenar para ampliar el comportamiento de forma modular.
  • Hay que tener cuidado de no abusar de ellos, o el código será difícil de entender.

Para acceder completo a curso necesitas un plan básico

El plan básico te dará acceso completo a todos los cursos, ejercicios y lecciones de Códica, proyectos y acceso de por vida a la teoría de las lecciones completadas. La suscripción se puede cancelar en cualquier momento.

Obtener acceso
130
cursos
1000
ejercicios
2000+
horas de teoría
3200
test

Obtén acceso

Cursos de programación para principiantes y desarrolladores experimentados. Comienza tu aprendizaje de forma gratuita

  • 130 cursos, 2000+ horas de teoría
  • 1000 ejercicios prácticos en el navegador
  • 360 000 estudiantes
Al enviar el formulario, aceptas el «Política de privacidad» y los términos de la «Oferta», y también aceptas los «Términos y condiciones de uso»

Nuestros graduados trabajan en empresas como:

Bookmate
Health Samurai
Dualboot
ABBYY