Ejercicios Python - Nivel Intermedio (POO) - Parte 3

Ejercicio 16

Crea una clase Contador que actúe como un iterador para contar hasta un número dado.

Solución
class Contador:
    def __init__(self, limite):
        self.limite = limite
        self.contador = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.contador < self.limite:
            self.contador += 1
            return self.contador
        else:
            raise StopIteration

Ejemplo de uso

contador = Contador(3)
for numero in contador:
    print(numero)  # 1 2 3

Ejercicio 17

Crea una clase LoggerMixin para agregar registro de actividades a otras clases.

Solución
class LoggerMixin: 
  def log(self, mensaje): 
    print(f"Log: {mensaje}")

class Usuario(LoggerMixin): 
  def init(self, nombre): 
  self.nombre = nombre

def realizar_actividad(self):
    self.log(f"{self.nombre} realizó una actividad")

Ejemplo de uso

usuario = Usuario("Carlos")
usuario.realizar_actividad()  # Log: Carlos realizó una actividad

Ejercicio 18

Crea una clase Conversor que permita convertir entre unidades (por ejemplo, kilómetros a millas).

Solución
class Conversor: 

  @staticmethod 
  def kilometros_a_millas(km): 
    return km * 0.621371

  @classmethod
  def millas_a_kilometros(cls, millas):
    return millas / 0.621371

Ejemplo de uso

print(Conversor.kilometros_a_millas(5))  # 3.106855
print(Conversor.millas_a_kilometros(3))  # 4.828032

Ejercicio 19

Crea una jerarquía de clases: Vehiculo como base, con subclases Auto y Moto.

Solución
class Vehiculo: 
  
  def __init__(self, marca): 
  self.marca = marca

class Auto(Vehiculo): 
  def __init__(self, marca, puertas): 
    super().__init__(marca) 
    self.puertas = puertas

class Moto(Vehiculo): 
  def __init__(self, marca, cilindrada): 
    super().init(marca) 
    self.cilindrada = cilindrada

Ejemplo de uso

auto = Auto("Toyota", 4)
moto = Moto("Yamaha", 250)
print(auto.marca)  # Toyota
print(moto.cilindrada)  # 250

Ejercicio 20

Crea una clase Punto cuyos atributos sean de solo lectura.

Solución
class Punto: 
  def __init__(self, x, y): 
    self._x = x self._y = y

  @property
  def x(self):
    return self._x

  @property
  def y(self):
    return self._y

Ejemplo de uso

punto = Punto(5, 10)
print(punto.x)  # 5
print(punto.y)  # 10
punto.x = 10  # AttributeError: can't set AttributeError

Ejercicio 21

Implementa la clase Fraccion que permita comparar fracciones usando operadores (<, >, ==).

Solución
class Fraccion: 
  def __init__(self, numerador, denominador): 
  self.numerador = numerador 
  self.denominador = denominador

def __eq__(self, otra):
    return self.numerador * otra.denominador == self.denominador * otra.numerador

def __lt__(self, otra):
    return self.numerador * otra.denominador < self.denominador * otra.numerador

Ejemplo de uso

f1 = Fraccion(1, 2)
f2 = Fraccion(1, 3)
print(f1 == f2)  # False
print(f1 < f2)   # False

Ejercicio 22

Crea una clase Calculadora que permita llamar a sus instancias como si fueran funciones.

Solución
class Calculadora: 
  def __call__(self, a, b): 
    return a + b 

Ejemplo de uso

calculadora = Calculadora() 
print(calculadora(2, 3)) # 5