Introduccion a la Programación Orientada a Objetos (POO) en Python

La Programación Orientada a Objetos (POO) es un paradigma que organiza el código en objetos que combinan datos (atributos) y comportamientos (métodos). En Python, la POO es una forma popular y sencilla de estructurar programas más complejos.

Conceptos principales de POO

1. Clase

Una clase es un modelo o plantilla a partir del cual se crean los objetos. Define los atributos y métodos comunes a los objetos de ese tipo.

class Persona:
    def __init__(self, nombre, edad):
        self.nombre = nombre  # Atributo
        self.edad = edad      # Atributo

    def saludar(self):  # Método
        print(f"Hola, mi nombre es {self.nombre} y tengo {self.edad} años.")

2. Objeto

Un objeto es una instancia de una clase.

# Crear un objeto de la clase Persona
persona1 = Persona("Carlos", 25)
persona1.saludar()  # Salida: Hola, mi nombre es Carlos y tengo 25 años.

3. Atributos

Los atributos son las variables asociadas a una clase u objeto que almacenan datos.

persona1.nombre  # Salida: Carlos
persona1.edad    # Salida: 25

4. Métodos

Los métodos son funciones definidas dentro de una clase que actúan sobre los objetos.

persona1.saludar()  # Salida: Hola, mi nombre es Carlos y tengo 25 años.

El método __init__() es especial en Python y se llama automáticamente cuando se crea un nuevo objeto de la clase. Se utiliza habitualmente para inicializar los atributos del objeto.

5. Herencia

La herencia permite que una clase (hija) herede atributos y métodos de otra clase (padre).

class Estudiante(Persona):  # Clase hija
    def __init__(self, nombre, edad, grado):
        super().__init__(nombre, edad)  # Heredar atributos
        self.grado = grado

    def estudiar(self):  # Nuevo método
        print(f"{self.nombre} está estudiando en {self.grado}.")

# Crear un objeto de la clase Estudiante
estudiante1 = Estudiante("Ana", 20, "Universidad")
estudiante1.saludar()   # Salida: Hola, mi nombre es Ana y tengo 20 años.
estudiante1.estudiar()  # Salida: Ana está estudiando en Universidad.

6. Encapsulamiento

El encapsulamiento protege los atributos de una clase para que no puedan ser modificados directamente. Se implementa mediante prefijos como _ o __ en los nombres de los atributos.

class CuentaBancaria:
    def __init__(self, saldo):
        self.__saldo = saldo  # Atributo privado

    def depositar(self, monto):
        self.__saldo += monto

    def obtener_saldo(self):
        return self.__saldo

cuenta = CuentaBancaria(1000)
cuenta.depositar(500)
print(cuenta.obtener_saldo())  # Salida: 1500

7. Polimorfismo

El polimorfismo permite que diferentes clases tengan métodos con el mismo nombre pero comportamientos distintos.

class Perro:
    def hacer_sonido(self):
        print("Guau!")

class Gato:
    def hacer_sonido(self):
        print("Miau!")

# Uso de polimorfismo
animales = [Perro(), Gato()]
for animal in animales:
    animal.hacer_sonido()
# Salida:
# Guau!
# Miau!

Resumen

  • Clase: Plantilla para crear objetos.
  • Objeto: Instancia de una clase.
  • Atributos: Variables asociadas a un objeto.
  • Métodos: Funciones asociadas a un objeto.
  • Herencia: Reutilización de código entre clases.
  • Encapsulamiento: Protección de atributos.
  • Polimorfismo: Métodos con el mismo nombre y diferentes comportamientos.

¡La POO es una herramienta poderosa para organizar y reutilizar código en proyectos grandes!