Conceptos básicos de la programación orientada a objeto
Clase
Es un plano o plantilla que define los atributos y métodos de un objeto. Es una abstracción que describe las características y comportamientos comunes a todos los objetos de ese tipo.
Las clases permiten crear múltiples instancias de objetos con la misma estructura pero con datos distintos.
Ejemplo:
Clase Persona:
    def __init__(self, nombre, edad):
        self.nombre = nombre
        self.edad = edad
    def saludar(self):
        print(f"Hola, soy {self.nombre} y tengo {self.edad} años.")
Aquí, Persona es una clase, y puedes crear objetos como persona1 = Persona("Juan", 30).
Atributos
Son las variables dentro de una clase que representan las propiedades o características de un objeto.
Los atributos se definen en el método especial __init__ (el constructor de la clase).
Ejemplo:
clase Coche:
    def __init__(self, color, marca):
        self.color = color  # Atributo
        self.marca = marca  # Atributo
En este caso, color y marca son atributos de los objetos Coche.
Métodos
Son las funciones que se definen dentro de una clase y representan los comportamientos o acciones que los objetos de esa clase pueden realizar.
Los métodos pueden acceder y modificar los atributos del objeto.
Ejemplo:
clase Coche:
    def __init__(self, marca, color):
        self.marca = marca
        self.color = color
    
    def arrancar(self):
        print(f"El coche {self.marca} de color {self.color} ha arrancado.")
El método arrancar es una acción que puede realizar un objeto Coche.
Encapsulamiento
Es el principio que consiste en ocultar los detalles internos de un objeto (sus atributos y métodos) y solo exponer lo necesario a través de una interfaz pública.
Esto se logra mediante el uso de modificadores de acceso, como público (accesible desde fuera de la clase) y privado (accesible solo desde dentro de la clase).
En Python, los atributos privados se indican poniendo un guion bajo (_) antes del nombre del atributo (por convención).
Ejemplo:
clase Coche:
    def __init__(self, marca):
        self._marca = marca  # Atributo privado por convención
    
    def obtener_marca(self):
        return self._marca  # Método público para acceder al atributo privado
Objeto
Es una instancia de una clase. Los objetos representan entidades del mundo real o conceptos abstractos y tienen atributos (datos) y métodos (funciones que operan sobre esos datos).
Los objetos encapsulan su estado y comportamiento.
Ejemplo: Si creamos una clase Coche, un objeto sería un coche específico con atributos como color y modelo, y métodos como acelerar o frenar.
clase Coche:
    def __init__(self, color, modelo):
        self.color = color
        self.modelo = modelo
Es un paradigma de programación que organiza el código en "objetos" que representan entidades del mundo real o conceptos abstractos. Este enfoque facilita la modularidad, reutilización y mantenimiento del código
Herencia
Es un mecanismo que permite crear una nueva clase basada en una clase existente. La nueva clase hereda los atributos y métodos de la clase base y puede agregar o modificar su comportamiento.
La herencia promueve la reutilización del código y la extensión de funcionalidades sin necesidad de reescribir todo.
Ejemplo:
Clase Animal:
    def __init__(self, nombre):
        self.nombre = nombre
    
    def hablar(self):
        pass  # Método abstracto
Clase Perro(Animal):
    def hablar(self):
 volver "Guau"
Clase Gato(Animal):
    def hablar(self):
 volver "Miau"
perro = Perro("Rex")
print(perro.hablar())  # Guau
Aquí, Perro y Gato heredan de Animal y cada uno implementa su propio método hablar.
Polimorfismo
Es la capacidad de usar un mismo nombre de método en diferentes clases y que cada clase lo implemente de manera diferente.
Permite que objetos de diferentes clases respondan de manera distinta al mismo mensaje o método.
Ejemplo:
Clase Ave:
    def volar(self):
        print("El ave está volando")
Clase Murciélago(Ave):
    def volar(self):
        print("El murciélago está volando en la oscuridad")
ave = Ave()
murciélago = murciélago()
ave.volar()  # El ave está volando
murciélago.volar() # El murciélago está volando en la oscuridad
Aunque ambos objetos llaman al mismo método volar(), el comportamiento es diferente.
Abstracción
Es el proceso de ocultar la complejidad interna de un objeto y solo exponer las características esenciales.
En Python, esto se puede lograr mediante clases abstractas y métodos abstractos usando el módulo abc.
Ejemplo:pitónCopiar códigode abc import ABC, abstractmethodclase Animal (ABC):    @abstractmethod    def sonido(self): pasarClase Perro(Animal):    def sonido(self): volver "Guau"Aquí, la clase Animal tiene un método abstracto sonido() que debe ser implementado por las subclases.
