Programación Orientada a Objetos en Python

class Usuario:
    """Representa un usuario del sistema"""
    
    def __init__(self):
        self.nombre = "Ana"
        self.edad = 25
        self.genero = "femenino"
    
    def __str__(self):
        return f"Usuario: {self.nombre}"
    
    def saludar(self):
        print("Enviando saludo...")

Creación de Instancias

Atributos Privados

class CuentaBancaria:
    def __init__(self, titular):
        self.__titular = titular
    
    def __str__(self):
        return f"Titular: {self.__titular}"
    
    def cambiar_titular(self, nuevo_titular):
        self.__titular = nuevo_titular
    
    def obtener_titular(self):
        return self.__titular

Los atributos con doble guión bajo (__titular) son privadso y no accesibles directamente.

Métodos Privados

__nombre_metodo()

Método __del__

class Recurso:
    def __init__(self, id):
        self.__id = id
    
    def __del__(self):
        print(f"Liberando recurso {self.__id}")

# Uso
res1 = Recurso("A001")
res2 = res1
del res1  # No libera el objeto
del res2  # Libera el objeto

El destructor se ejecuta cuando el contador de referencias llega a cero o al finalizar el programa.

Herencia

class Vehiculo:
    def mover(self):
        print("Desplazándose...")

class Coche(Vehiculo):
    def acelerar(self):
        print("Acelerando motor...")

class Moto(Vehiculo):
    def hacer_caballito(self):
        print("Realizando maniobra...")

# Herencia multinivel
class CocheDeportivo(Coche):
    def turbo(self):
        print("Activando turbo...")
        super().acelerar()

Constructores en Herencia

class Estudiante(Persona):
    def __init__(self, curso, nombre, edad):
        super().__init__(nombre, edad)
        self.curso = curso

Herencia Múltiple

class InterfazA:
    def operar(self):
        print("Operación A")

class InterfazB:
    def operar(self):
        print("Operación B")

class Sistema(InterfazB, InterfazA):
    pass

# Orden de resolución
print(Sistema.__mro__)

En conflictos de nombres, prevalece el método de la primera clase padre.

Manejo de Contextos

class ConexionBD:
    def __enter__(self):
        print("Estableciendo conexión...")
        return self
    
    def __exit__(self, exc_type, exc_val, exc_tb):
        if exc_tb:
            print("Error en contexto")
        else:
            print("Conexión exitosa")
        print("Cerrando conexión")
        return True
    
    def consultar(self):
        print("Ejecutando consulta...")

with ConexionBD() as conn:
    conn.consultar()

Etiquetas: Python POO clases herencia Encapsulamiento

Publicado el 7-19 12:02