Lección 7.6: Delegación
Delegación en Python
Introducción
¡Hola a todos! Soy Yuscu Mejía y en esta lección vamos a explorar el concepto de delegación en Python. La delegación es una técnica de diseño de software que permite a un objeto pasar una tarea a otro objeto, aprovechando así la funcionalidad de este último.
Características
La delegación en Python tiene las siguientes características:
- Permite a un objeto delegar parte de su funcionalidad a otro objeto.
- Facilita la composición sobre la herencia, permitiendo construir clases complejas a partir de clases más simples.
- Promueve la reutilización del código y la separación de responsabilidades.
- Es útil en la implementación de patrones de diseño como el patrón delegado.
Ejemplos
A continuación, algunos ejemplos de cómo utilizar la delegación en Python, presentados por Yuscu Mejía:
- Definición de una clase que delega una tarea a otra clase:
# Definir una clase llamada 'Motor'
class Motor:
def encender(self):
return "El motor está encendido"
def apagar(self):
return "El motor está apagado"
# Definir una clase llamada 'Coche' que delega tareas al 'Motor'
class Coche:
def __init__(self):
self.motor = Motor() # Delegación
def arrancar(self):
return self.motor.encender()
def detener(self):
return self.motor.apagar()
# Crear una instancia de la clase 'Coche'
mi_coche = Coche()
print(mi_coche.arrancar()) # Imprime: El motor está encendido
print(mi_coche.detener()) # Imprime: El motor está apagado
Práctica
Para practicar, les invito a ver nuestro tutorial en video sobre delegación en Python, presentado por Yuscu Mejía:
Recorda si te gusta los videos, te agradeceria si le pones un comentario o un like para saber si subir mas videos! 😮
Si no sabes que comentar, comenta con: estoy avanzando rapido con el curso de Programacion python 🙂 asi te detectaremos que viniste de aca, para una estadistica si conviene o no subir videos

Ejercicio
Ahora les propongo un ejercicio para aplicar lo que hemos aprendido sobre delegación en Python, con la guía de Yuscu Mejía:
Ejercicio 1
Tenemos la clase Persona
class Persona:
""""Representación de una persona, sus atributos son edad y altura."""
def __init__(self, edad=12, altura=15):
"""Constructor de Persona. Altura y edad deben ser numéricos y se inicializan por defecto en 15 y 12 respectivamente."""
self.edad = edad
self.altura = altura
def envejecer(self, anios=5): # self es yo mismo, o sea mi instancia
"""Envejece según los años ingresados."""
self.edad = self.edad + anios
a) Crear una clase llamada Arma que tenga como atributos precio, y como método disparar el cual retorna un string “mi arma es letal”.
b) Quiero que la persona contenga un arma. ¿Qué utilizaría, herencia, polimorfismo o delegación? ¿Por qué?
c) Una vez elegido el formato, incorporarlo y además crear un objeto persona que muestre el precio de su arma, y cómo dispara.
d) Pregunta teórica: ¿Y si quisiera tener más tipos de arma, ejemplo pistola, escopeta? ¿Qué agregarías a lo anterior que hiciste?
Ejercicio 2:
Vamos a crear una clase llamada ControlRemoto que delegue la funcionalidad de encender y apagar un televisor a una clase llamada Televisor:
#Ejercicio1
#a)
class Arma:
def __init__(self, precio):
self.precio = precio
def disparar(self):
return "mi arma es letal"
#b)
# No se utiliza herencia porque un arma no es una persona, y tampoco polimorfismo porque no vamos a redefinir el comportamiento de su clase madre.
# En cambio, una persona contiene un arma, entonces usamos delegación.
#c)
class Persona:
""""Representación de una persona, sus atributos son edad, altura y arma."""
def __init__(self, edad, altura, arma):
"""Constructor de Persona. Altura y edad deben ser numéricos y se inicializan por defecto en 15 y 12 respectivamente."""
self.edad = edad
self.altura = altura
self.arma = arma
def envejecer(self, anios=5):
"""Envejece según los años ingresados."""
self.edad = self.edad + anios
def atacar(self):
return "puedo atacarte con mi arma que vale {} y además es {}".format(self.arma.precio, self.arma.disparar())
# Crear un objeto Persona que contenga un Arma
unArma = Arma(20)
unaPersona = Persona(15, 10, unArma)
print(unaPersona.atacar())
#d)
# Tendría a la clase Arma como clase madre, y sus clases hijas serían Pistola y Escopeta.
class Pistola(Arma):
def disparar(self):
return "mi pistola es letal"
class Escopeta(Arma):
def disparar(self):
return "mi escopeta es letal"
#Ejercicio 2
# Definir una clase llamada 'Televisor'
class Televisor:
def encender(self):
return "El televisor está encendido"
def apagar(self):
return "El televisor está apagado"
# Definir una clase llamada 'ControlRemoto' que delega tareas al 'Televisor'
class ControlRemoto:
def __init__(self):
self.televisor = Televisor() # Delegación
def encender_televisor(self):
return self.televisor.encender()
def apagar_televisor(self):
return self.televisor.apagar()
# Crear una instancia de la clase 'ControlRemoto'
mi_control = ControlRemoto()
print(mi_control.encender_televisor()) # Imprime: El televisor está encendido
print(mi_control.apagar_televisor()) # Imprime: El televisor está apagado

