python 3
python 3
def saludar(self):
return f"Hola, mi nombre es {self.nombre} y tengo {self.edad}
años."
Observacion
__init__ es un método especial en Python que se usa como el constructor de una clase.
Se ejecuta automáticamente cuando se crea una nueva instancia de la clase y se utiliza para
inicializar atributos.
def ladrar(self):
print(f"{self.nombre} está ladrando 🐶")
# Crear un objeto (instancia) de la clase Perro
mi_perro = Perro("Firulais", "Labrador")
print(mi_perro.nombre) # Firulais
print(mi_perro.raza) # Labrador
mi_perro.ladrar() # Firulais está ladrando 🐶🔹 Explicación
🔹 Sin __init__
class Perro:
pass
mi_perro = Perro()
mi_perro.nombre = "Firulais"
mi_perro.raza = "Labrador"
print(mi_perro.nombre) # Firulais
Esto funciona, pero __init__ hace que el código sea más organizado y fácil de manejar.
Observacion: debes definir la clase Perro antes de crear un objeto de ella, asegúrate de que
ladrar esté dentro de la clase Perro, con la indentación correcta:
✅ __init__ se usa para inicializar objetos cuando creamos una nueva instancia de una
clase.
✅ Es útil para asignar valores a atributos y evitar configuraciones manuales.
2️¿Qué es un Objeto?
Un objeto es una instancia de una clase, es decir, una entidad creada a partir de una
plantilla (clase).
📌 Explicación:
Son los métodos más comunes, operan sobre datos del objeto y usan self.
class Persona:
def __init__(self, nombre, edad):
self.nombre = nombre
self.edad = edad
def cumplir_años(self):
self.edad += 1 # Modifica la edad del objeto
class Persona:
contador = 0 # Atributo de clase
@classmethod
def cantidad_personas(cls):
return f"Se han creado {cls.contador} personas."
p1 = Persona("Carlos")
p2 = Persona("Ana")
python
CopiarEditar
class Utilidades:
@staticmethod
def es_mayor_de_edad(edad):
return edad >= 18
print(Utilidades.es_mayor_de_edad(20)) # True
print(Utilidades.es_mayor_de_edad(15)) # False
Ejemplo de Herencia
class Persona:
def __init__(self, nombre, edad):
self.nombre = nombre
self.edad = edad
def presentarse(self):
return f"Soy {self.nombre} y tengo {self.edad} años."
def presentarse(self):
return f"Soy {self.nombre}, tengo {self.edad} años y estudio
{self.carrera}."
📌 Características de la herencia:
def obtener_saldo(self):
return self.__saldo
cuenta = CuentaBancaria(1000)
cuenta.depositar(500)
print(cuenta.obtener_saldo()) # 1500
📌 Notas:
__saldo: Doble guion bajo lo hace privado (no accesible desde fuera).
Se accede a él usando métodos (obtener_saldo()).
6️Ejemplo Propuesto: Sistema de Vehículos
📌 Objetivo: Crear una clase Vehiculo y dos clases Coche y Moto que hereden
de ella.
✅ Código
python
CopiarEditar
class Vehiculo:
def __init__(self, marca, modelo):
self.marca = marca
self.modelo = modelo
def descripcion(self):
return f"Vehículo {self.marca} modelo {self.modelo}."
class Coche(Vehiculo):
def __init__(self, marca, modelo, puertas):
super().__init__(marca, modelo)
self.puertas = puertas
def descripcion(self):
return f"Coche {self.marca} modelo {self.modelo} con
{self.puertas} puertas."
class Moto(Vehiculo):
def __init__(self, marca, modelo, cilindrada):
super().__init__(marca, modelo)
self.cilindrada = cilindrada
def descripcion(self):
return f"Moto {self.marca} modelo {self.modelo} de
{self.cilindrada}cc."
📌 Resumen
Concepto Descripción
Clase Plantilla para crear objetos.
Objeto Instancia de una clase.
Métodos Funciones dentro de una clase.
Concepto Descripción
Herencia Crear una nueva clase basada en otra.
Encapsulamiento Controlar el acceso a los datos.
python
CopiarEditar
class Persona:
def __init__(self, nombre, edad):
self.nombre = nombre
self.edad = edad
🔹 Ejemplo propuesto: Crea una clase Coche que tenga atributos marca, modelo y año.
python
CopiarEditar
class Persona:
def __init__(self, nombre, edad):
self.nombre = nombre
self.edad = edad
def __str__(self):
return f"Persona(nombre={self.nombre}, edad={self.edad})"
🔹 Ejemplo propuesto: Modifica la clase Coche para que print(coche) muestre "Coche
Toyota Corolla 2022".
3️⃣__repr__ (Representación oficial del objeto)
📌 Es similar a __str__, pero su propósito es ser más técnico (para depuración).
python
CopiarEditar
class Persona:
def __init__(self, nombre, edad):
self.nombre = nombre
self.edad = edad
def __repr__(self):
return f"Persona('{self.nombre}', {self.edad})"
python
CopiarEditar
class Grupo:
def __init__(self, miembros):
self.miembros = miembros
def __len__(self):
return len(self.miembros)
🔹 Ejemplo propuesto: Crea una clase Biblioteca que tenga una lista de libros y usa
__len__ para devolver cuántos libros hay.
python
CopiarEditar
class Saludo:
def __call__(self, nombre):
return f"¡Hola, {nombre}!"
saludar = Saludo()
print(saludar("Juan")) # "¡Hola, Juan!"
python
CopiarEditar
class ListaPersonalizada:
def __init__(self, datos):
self.datos = datos
🔹 Ejemplo propuesto: Crea una clase Agenda que almacene contactos y permita acceder a
ellos con agenda[nombre].
python
CopiarEditar
class Grupo:
def __init__(self, miembros):
self.miembros = miembros
🔹 Ejemplo propuesto: Crea una clase Inventario donde puedas verificar si un producto
está disponible con if "manzana" in inventario:.
python
CopiarEditar
class Persona:
def __init__(self, nombre, edad):
self.nombre = nombre
self.edad = edad
p1 = Persona("Carlos", 30)
p2 = Persona("Ana", 25)
🔹 Ejemplo propuesto: Crea una clase Producto que compare dos productos por su precio.
def __str__(self):
return str(self.valor)
n1 = Numero(10)
n2 = Numero(5)
n3 = n1 + n2
print(n3) # 15
🔹 Ejemplo propuesto: Crea una clase Tiempo que permita sumar horas y minutos con +.
def arrancar(self):
return "Motor encendido"
class Coche:
def __init__(self, marca, motor_potencia):
self.marca = marca
self.motor = Motor(motor_potencia) # Un objeto dentro de otro
def encender(self):
return f"{self.marca}: {self.motor.arrancar()}"
✅ Observaciones:
🔹 Ejemplo propuesto:
Crea una clase Casa que tenga objetos Habitacion. Cada Habitacion tiene un nombre y
un tamaño.
class Alumno:
def __init__(self, nombre):
self.nombre = nombre
✅ Observaciones:
🔹 Ejemplo propuesto:
Crea una clase Piloto que use un objeto Avion para volar.
def hacer_sonido(self):
return "Sonido genérico"
class Perro(Animal): # Herencia
def hacer_sonido(self):
return "Guau guau"
mi_perro = Perro("Firulais")
print(mi_perro.hacer_sonido()) # "Guau guau"
✅ Observaciones:
🔹 Ejemplo propuesto:
Crea una clase Gato que herede de Animal y defina su propio sonido.
4o
Dijiste:
ahora sobre Comunicando a objetos - Juego
ChatGPT dijo:
En los videojuegos, los objetos interactúan constantemente entre sí: un personaje recoge
objetos, ataca enemigos, abre puertas, etc. Para modelar estas interacciones en Python,
usamos composición, asociación y herencia.
1️⃣Comunicación por Composición
📌 Ejemplo: Un Jugador tiene una Espada Un jugador puede tener un arma equipada que
le da un ataque especial.
python
CopiarEditar
class Espada:
def __init__(self, daño):
self.daño = daño
def atacar(self):
return f"Golpe con {self.daño} de daño"
class Jugador:
def __init__(self, nombre, arma):
self.nombre = nombre
self.arma = arma # Contiene un objeto Espada
def atacar(self):
return f"{self.nombre} {self.arma.atacar()}"
espada = Espada(50)
jugador = Jugador("Héroe", espada)
🔹 Ejemplo propuesto:
Crea una clase Escudo que tenga un atributo defensa y agrégalo a Jugador.
python
CopiarEditar
class Enemigo:
def __init__(self, nombre, vida):
self.nombre = nombre
self.vida = vida
class Jugador:
def __init__(self, nombre, ataque):
self.nombre = nombre
self.ataque = ataque
🔹 Ejemplo propuesto:
Crea una clase Hechizo que un Mago pueda lanzar sobre un Enemigo.
python
CopiarEditar
class Jugador:
def __init__(self, nombre, ataque):
self.nombre = nombre
self.ataque = ataque
def atacar(self):
return f"{self.nombre} ataca con {self.ataque} de daño"
class Guerrero(Jugador):
def atacar(self):
return f"{self.nombre} ataca con espada e inflige {self.ataque}
de daño"
class Mago(Jugador):
def atacar(self):
return f"{self.nombre} lanza un hechizo y causa {self.ataque} de
daño mágico"
🔹 Ejemplo propuesto:
Añade una clase Arquero que herede de Jugador y use flechas.
4o
Dijiste:
ahora sobre herencia
ChatGPT dijo:
🔹 Herencia en Python
✅ Ventajas de la Herencia:
✔️Evita repetir código.
✔️Permite organizar mejor el programa.
✔️Facilita la extensión y el mantenimiento del código.
1️⃣Herencia Básica
📌 Ejemplo: Animal → Perro
python
CopiarEditar
class Animal:
def __init__(self, nombre):
self.nombre = nombre
def hacer_sonido(self):
return "Sonido genérico"
perro = Perro("Firulais")
print(perro.nombre) # Firulais (heredado de Animal)
print(perro.hacer_sonido()) # Guau guau (sobrescrito en Perro)
✅ Observaciones:
🔹 Ejemplo propuesto:
Crea una clase Gato que herede de Animal y haga "Miau miau".
python
CopiarEditar
class Empleado:
def __init__(self, nombre, salario):
self.nombre = nombre
self.salario = salario
def mostrar_info(self):
return f"Empleado: {self.nombre}, Salario: {self.salario}"
class Gerente(Empleado):
def __init__(self, nombre, salario, departamento):
super().__init__(nombre, salario) # Llama al constructor de
Empleado
self.departamento = departamento
def mostrar_info(self):
return f"Gerente: {self.nombre}, Salario: {self.salario},
Departamento: {self.departamento}"
gerente = Gerente("Carlos", 5000, "Ventas")
print(gerente.mostrar_info())
# "Gerente: Carlos, Salario: 5000, Departamento: Ventas"
✅ Observaciones:
🔹 Ejemplo propuesto:
Crea una clase Director que herede de Gerente y tenga un atributo empresa.
3️⃣Herencia Múltiple
📌 Ejemplo: Mamífero + Volador → Murciélago
python
CopiarEditar
class Mamifero:
def amamantar(self):
return "Amamantando crías"
class Volador:
def volar(self):
return "Volando alto"
murcielago = Murcielago()
print(murcielago.amamantar()) # "Amamantando crías"
print(murcielago.volar()) # "Volando alto"
print(murcielago.hacer_sonido()) # "Chirp chirp"
✅ Observaciones:
🔹 Ejemplo propuesto:
Crea una clase Anfibio que herede de Acuatico y Terrestre.
4️⃣Herencia y isinstance()
📌 Ejemplo: Verificar si un objeto pertenece a una clase
python
CopiarEditar
class Persona:
pass
class Estudiante(Persona):
pass
juan = Estudiante()
✅ Observaciones:
🔹 Ejemplo propuesto:
Crea una clase Profesor y verifica si un objeto pertenece a Profesor o Persona.
isinstance(juan, Persona) →
isinstance() Verifica si un objeto es de una clase.
True.
4o
Dijiste:
mas ejemplos y problemas propuestos
ChatGPT dijo:
Aquí tienes más ejemplos y problemas propuestos sobre herencia en Python, organizados
desde lo básico hasta lo avanzado. 🚀
python
CopiarEditar
class Vehiculo:
def __init__(self, marca, modelo):
self.marca = marca
self.modelo = modelo
def describir(self):
return f"Vehículo {self.marca} {self.modelo}"
class Coche(Vehiculo):
def __init__(self, marca, modelo, puertas):
super().__init__(marca, modelo)
self.puertas = puertas
def describir(self):
return f"Coche {self.marca} {self.modelo}, {self.puertas}
puertas"
class Moto(Vehiculo):
def __init__(self, marca, modelo, cilindrada):
super().__init__(marca, modelo)
self.cilindrada = cilindrada
def describir(self):
return f"Moto {self.marca} {self.modelo}, {self.cilindrada} cc"
✅ Conceptos aplicados:
🔹 Problema propuesto:
Crea una clase Camion que herede de Vehiculo y agregue un atributo capacidad_carga.
class Empleado:
def __init__(self, nombre, salario_base):
self.nombre = nombre
self.salario_base = salario_base
def calcular_salario(self):
return self.salario_base
class EmpleadoTiempoCompleto(Empleado):
def calcular_salario(self):
return self.salario_base # Mismo salario base
class EmpleadoPorHoras(Empleado):
def __init__(self, nombre, tarifa_hora, horas_trabajadas):
super().__init__(nombre, tarifa_hora * horas_trabajadas)
def calcular_salario(self):
return self.salario_base # Salario basado en horas trabajadas
print(empleado_fijo.calcular_salario()) # 3000
print(empleado_horas.calcular_salario()) # 2400
✅ Conceptos aplicados:
🔹 Problema propuesto:
Crea una clase Gerente que tenga un bono adicional en su salario.
🔹 Ejemplo 3: Videojuego con Herencia
Múltiple
📌 Escenario:
En un videojuego, tenemos personajes que pueden ser magos y/o guerreros, cada uno con
habilidades distintas.
class Guerrero:
def atacar(self):
return "Ataca con espada"
class Mago:
def lanzar_hechizo(self):
return "Lanza un hechizo de fuego"
paladin = Paladin()
print(paladin.habilidades()) # "Ataca con espada y Lanza un hechizo de
fuego"
✅ Conceptos aplicados:
🔹 Problema propuesto:
Crea una clase Arquero que herede de Guerrero y tenga un método disparar_flecha().
class Persona:
pass
class Estudiante(Persona):
pass
juan = Estudiante()
✅ Conceptos aplicados:
🔹 Problema propuesto:
Crea una clase Profesor que herede de Persona y verifica si un objeto de Profesor es
instancia de Persona.
class Animal:
def __init__(self, nombre):
self.nombre = nombre
def info(self):
return f"Soy un animal llamado {self.nombre}"
class Terrestre(Animal):
def __init__(self, nombre, velocidad):
super().__init__(nombre)
self.velocidad = velocidad
def info(self):
return f"{super().info()} y corro a {self.velocidad} km/h"
class Acuatico(Animal):
def __init__(self, nombre, profundidad):
super().__init__(nombre)
self.profundidad = profundidad
def info(self):
return f"{super().info()} y nado a {self.profundidad} metros de
profundidad"
✅ Conceptos aplicados:
🔹 Problema propuesto:
Crea una clase Anfibio que herede de Terrestre y Acuatico, combinando ambas
características.
1️⃣ Crea una clase Camion que herede de Vehiculo y tenga capacidad_carga.
2️⃣ Crea una clase Gerente que herede de Empleado y tenga un bono extra.
3️⃣ Crea una clase Arquero que herede de Guerrero y dispare flechas.
4️⃣ Crea una clase Profesor que herede de Persona y verifica su tipo con isinstance().
4o
Dijiste:
ahora sobre • Decorador @property
ChatGPT dijo:
El decorador @property permite definir métodos que pueden ser accedidos como si
fueran atributos. Se usa para controlar el acceso a los atributos de una clase,
proporcionando una interfaz más segura y flexible.
Los métodos get y set sí se incluyen, pero en Python se manejan de una forma más
elegante usando el decorador @property, que reemplaza los métodos tradicionales
get() y set() de otros lenguajes como Java o C++.
python
CopiarEditar
class Persona:
def __init__(self, nombre):
self._nombre = nombre # Convención: "_" indica atributo
"privado"
def get_nombre(self):
return self._nombre
persona = Persona("Carlos")
print(persona.get_nombre()) # "Carlos"
persona.set_nombre("Ana")
print(persona.get_nombre()) # "Ana"
✅ Desventajas:
python
CopiarEditar
class Persona:
def __init__(self, nombre):
self._nombre = nombre # Convención: "_" indica atributo privado
@property
def nombre(self):
return self._nombre # Getter
@nombre.setter
def nombre(self, nuevo_nombre):
if isinstance(nuevo_nombre, str): # Validación
self._nombre = nuevo_nombre
else:
raise ValueError("El nombre debe ser una cadena de texto")
persona = Persona("Carlos")
print(persona.nombre) # ✅ "Carlos" (Sin usar get_nombre())
# persona.nombre = 123 ❌ Error: "El nombre debe ser una cadena de texto"
✅ Ventajas de @property:
🔹 Problema propuesto:
Crea una clase CuentaBancaria con @property para saldo, asegurando que no pueda ser
negativo.
python
CopiarEditar
class Producto:
_iva = 0.16 # IVA del 16% como atributo de clase
@classmethod
def get_iva(cls):
return cls._iva # Getter de IVA
@classmethod
def set_iva(cls, nuevo_iva):
if 0 <= nuevo_iva <= 1:
cls._iva = nuevo_iva # Setter de IVA
else:
raise ValueError("El IVA debe estar entre 0 y 1")
print(Producto.get_iva()) # 0.16
Producto.set_iva(0.18) # Se cambia el IVA
print(Producto.get_iva()) # 0.18
✅ Observaciones:
🔹 Problema propuesto:
Crea una clase Banco con @classmethod para modificar la tasa de interés de todas las
cuentas.
🔹 Resumen
¿Se usa
¿Usa ¿Usa para
Métodos Decorador Ejemplo de uso
self? cls? atributos
de...?
get y set obj.get_nombre() /
Ninguno ✅ Sí ❌ No Instancia
tradicionales obj.set_nombre("Ana")
@property y obj.nombre / obj.nombre =
@setter
@property ✅ Sí ❌ No Instancia "Ana"
@classmethod ❌ No ✅ Sí Clase
@classmethod Clase.metodo()
@staticmethod @staticmethod ❌ No ❌ No
No accede a Clase.metodo()
nada
python
CopiarEditar
import math
class Circulo:
def __init__(self, radio):
self._radio = radio # Se usa _radio como atributo "privado"
@property
def radio(self):
return self._radio # Permite leer el radio
@property
def area(self):
return math.pi * self._radio ** 2 # Calcula el área sin
necesidad de un método adicional
circulo = Circulo(5)
print(circulo.radio) # 5
print(circulo.area) # 78.5398...
✅ Observaciones:
🔹 Problema propuesto:
Crea una clase Cuadrado que tenga una propiedad lado y una propiedad perimetro.
python
CopiarEditar
class Persona:
def __init__(self, nombre, edad):
self._nombre = nombre
self._edad = edad # Se almacena en una variable "privada"
@property
def edad(self):
return self._edad # Getter
@edad.setter
def edad(self, nueva_edad):
if nueva_edad < 0:
raise ValueError("La edad no puede ser negativa")
self._edad = nueva_edad # Setter con validación
✅ Observaciones:
🔹 Problema propuesto:
Crea una clase CuentaBancaria con una propiedad saldo que no permita valores
negativos.
python
CopiarEditar
class Empleado:
def __init__(self, nombre, salario):
self._nombre = nombre
self._salario = salario
@property
def salario(self):
return self._salario
@salario.deleter
def salario(self):
print("El salario ha sido eliminado")
del self._salario # Se elimina el atributo
✅ Observaciones:
python
CopiarEditar
class Rectangulo:
def __init__(self, base, altura):
self._base = base
self._altura = altura
@property
def base(self):
return self._base
@property
def altura(self):
return self._altura
@property
def area(self):
return self._base * self._altura
@property
def perimetro(self):
return 2 * (self._base + self._altura)
rectangulo = Rectangulo(10, 5)
print(rectangulo.area) # 50
print(rectangulo.perimetro) # 30
✅ Observaciones:
🔹 Problema propuesto:
Crea una clase Cilindro con propiedades volumen y superficie.
4o
Dijiste:
ahora sobre Decoradores @classmethod & staticmethod
ChatGPT dijo:
🔹 Diferencias clave:
Recibe Accede a
Recibe self
Decorador cls atributos/metodos de Se usa para...
(Instancia)
(Clase) clase
1️⃣Uso de @classmethod
📌 Ejemplo: Crear instancias desde un método de clase
python
CopiarEditar
class Persona:
cantidad_personas = 0 # Atributo de clase
def __init__(self, nombre, edad):
self.nombre = nombre
self.edad = edad
Persona.cantidad_personas += 1 # Modifica el atributo de clase
@classmethod
def desde_cadena(cls, cadena):
nombre, edad = cadena.split("-")
return cls(nombre, int(edad)) # Crea y devuelve una instancia
@classmethod
def contar_personas(cls):
return f"Total de personas creadas: {cls.cantidad_personas}"
p1 = Persona("Juan", 30)
p2 = Persona.desde_cadena("Ana-25") # Usa @classmethod para crear una
instancia
print(p2.nombre) # "Ana"
print(Persona.contar_personas()) # "Total de personas creadas: 2"
✅ Observaciones:
🔹 Problema propuesto:
Crea una clase Coche con un método desde_lista(cls, lista) que cree instancias
desde una lista de datos.
2️⃣Uso de @staticmethod
📌 Ejemplo: Métodos auxiliares dentro de la clase
python
CopiarEditar
class Utilidad:
@staticmethod
def es_par(numero):
return numero % 2 == 0 # Devuelve True si es par
@staticmethod
def sumar(a, b):
return a + b # Simplemente suma dos números
print(Utilidad.es_par(4)) # True
print(Utilidad.sumar(10, 20)) # 30
✅ Observaciones:
@staticmethod no recibe cls ni self, es totalmente independiente.
Se usa cuando no se necesita acceder a atributos de clase ni de instancia.
es_par() y sumar() son funciones normales dentro de la clase, pero no dependen de
instancias.
🔹 Problema propuesto:
Crea una clase Conversor con un método celsius_a_fahrenheit(temp) que convierta
temperaturas.
python
CopiarEditar
class Producto:
impuesto = 1.21 # IVA del 21%
@classmethod
def cambiar_impuesto(cls, nuevo_impuesto):
cls.impuesto = nuevo_impuesto # Cambia el impuesto global
@staticmethod
def calcular_precio_con_iva(precio):
return precio * 1.21 # Solo realiza el cálculo, sin modificar
atributos
print(Producto.calcular_precio_con_iva(100)) # 121.0
Producto.cambiar_impuesto(1.18) # Cambia el IVA a 18%
print(Producto.impuesto) # 1.18
✅ Observaciones:
🔹 Problema propuesto:
Crea una clase Banco con un método ajustar_tasa_interes(cls, nueva_tasa) y otro
método calcular_interes(monto, tasa).
4️⃣Combinación de @property, @classmethod y @staticmethod
📌 Ejemplo: Cuenta Bancaria
python
CopiarEditar
class CuentaBancaria:
tasa_interes = 0.05 # 5% de interés anual
@property
def saldo(self):
return self._saldo # Getter
@classmethod
def cambiar_tasa_interes(cls, nueva_tasa):
cls.tasa_interes = nueva_tasa # Cambia la tasa para todas las
cuentas
@staticmethod
def calcular_interes(monto, tasa):
return monto * tasa # Solo realiza un cálculo matemático
✅ Observaciones:
🔹 Problema propuesto:
Crea una clase Empleado con un método cambiar_sueldo_minimo(cls, nuevo_sueldo)
y otro método calcular_bono(sueldo, porcentaje).
completa.
4o
Buscar
Reason