Encapsulamiento: Protegiendo la Integridad de los Datos
El Encapsulamiento consiste en agrupar los datos (atributos) y los comportamientos (métodos) en una sola unidad (la clase) y controlar quién puede verlos o modificarlos. Es el equivalente a la "caja negra" en ingeniería: sabes qué hace, pero no necesitas (ni debes) tocar los cables internos para que funcione.
1. Niveles de Acceso en Python
A diferencia de otros lenguajes como Java o C++, Python no tiene palabras clave como private o public. En su lugar, utiliza una convención de nombres basada en guiones bajos:
Público (Sin guiones)
Cualquier atributo o método es accesible desde fuera de la clase.
self.nombre = "Alex"
Protegido (Un guion bajo: _)
Indica a otros programadores que el atributo es de uso interno y no debería tocarse desde fuera, aunque técnicamente Python aún lo permite. Es una "advertencia de caballeros".
self._saldo_interno = 100
Privado (Dos guiones bajos: __)
Python aplica un mecanismo llamado Name Mangling para dificultar el acceso desde fuera. Si intentas acceder a objeto.__atributo, el programa lanzará un error. Es la forma más fuerte de proteger un dato.
self.__clave_secreta = "12345"
2. Getters y Setters: Los Porteros
Para interactuar con atributos privados de forma segura, utilizamos métodos especiales: * Getter (Obtener): Un método que retorna el valor del atributo privado. * Setter (Establecer): Un método que permite cambiar el valor, pero incluyendo validaciones. Por ejemplo, un setter de "edad" podría impedir que se asigne un número negativo.
3. ¿Por qué es importante?
- Control Total: Puedes validar los datos antes de guardarlos.
- Flexibilidad: Puedes cambiar la implementación interna (el nombre de la variable interna) sin romper el código de las personas que usan tu clase.
- Seguridad: Evita que el estado de un objeto se vuelva inconsistente (por ejemplo, que una cuenta bancaria tenga saldo negativo si las reglas del negocio no lo permiten).
Reto: La Caja Fuerte Bancaria
Vas a crear una clase para manejar una cuenta de ahorros. El saldo debe ser estrictamente privado para que nadie pueda modificarlo sin pasar por los métodos oficiales.
Instrucciones:
1. Crea la clase CuentaBancaria.
2. En el __init__, define un atributo privado llamado __saldo e inicialízalo con el valor que reciba la función.
3. Crea un método getter llamado obtener_saldo que retorne el valor de __saldo.
4. Crea un método setter llamado depositar que reciba una cantidad. Si la cantidad es mayor a 0, súmala al saldo; si no, no hagas nada.
5. Crea un objeto mi_cuenta con 1000 de saldo inicial.
6. Llama al método depositar con 500 y guarda el saldo final en la variable saldo_final usando el getter.
# Protege el saldo de la cuenta: