Modificadores de acceso
Parte de la sección Programación orientada a objetos del Journey de Python de Coddy. Lección 29 de 64.
Los modificadores de acceso controlan la visibilidad de los atributos y métodos de una clase. Python usa convenciones de nomenclatura en lugar de palabras clave para controlar el acceso.
Aquí tienes un ejemplo de acceso público (sin prefijo):
class Person:
def __init__(self):
self.name = "Coddy" # Atributo público
def greet(self): # Método público
return f"Hello, I'm {self.name}"Accede a los miembros públicos desde cualquier lugar:
person = Person()
print(person.name) # Coddy
print(person.greet()) # Hello, I'm CoddyAquí tienes un ejemplo de acceso protegido (guion bajo simple):
class Employee:
def __init__(self):
self._salary = 50000 # Atributo protegido
def _calculate_bonus(self): # Método protegido
return self._salary * 0.1
def show_bonus(self):
return self._calculate_bonus() # Se puede usar dentro de la claseAccede a los miembros protegidos (funciona, pero no se recomienda):
employee = Employee()
print(employee._salary) # 50000 - funciona, pero no se recomienda
print(employee.show_bonus()) # 5000.0 - forma correctaAquí tienes un ejemplo de acceso privado (doble guion bajo):
class User:
def __init__(self):
self.__password = "secure123" # Atributo privado
def __encrypt(self, data): # Método privado
return f"Encrypted: {data}"
def verify(self, input_password):
# Miembros privados accesibles dentro de la clase
return input_password == self.__passwordUsa correctamente los miembros privados:
user = User()
print(user.verify("secure123")) # True - usando el método público
# print(user.__password) # AttributeError - no se puede acceder directamenteSalida:
Coddy
Hello, I'm Coddy
50000
5000.0
TruePunto clave: Los modificadores de acceso de Python son convenciones de nomenclatura: sin prefijo = público (accesible desde cualquier lugar), un guion bajo = protegido (uso interno), dos guiones bajos = privado (solo en la clase). Estos ayudan a establecer límites claros y a evitar el uso accidental indebido de los elementos internos de una clase.
Desafío
IntermedioEn este desafío, implementarás una clase FileManager que demuestra los modificadores de acceso de Python (público, protegido y privado), mientras experimentas los beneficios de las pruebas exhaustivas.
Edita filemanager.py para implementar la clase FileManager siguiendo los comentarios TODO. El archivo contiene instrucciones detalladas para implementar:
- Métodos públicos para operaciones con archivos
- Métodos protegidos (con prefijo de un guion bajo)
- Métodos privados (con prefijo de dos guiones bajos)
- Interacciones entre métodos que demuestran la encapsulación
Pruébalo tú mismo
from file_manager import FileManager
# Gestor completo de casos de prueba
test_case = input()
if test_case == "basic_test":
# Crea una instancia de FileManager
manager = FileManager()
# Llama al método read_file
print(manager.read_file("example.txt"))
# Llama al método get_file_content
print(manager.get_file_content("example.txt"))
elif test_case == "protected_access":
# Crea una instancia de FileManager
manager = FileManager()
# Intenta llamar al método protegido
# Los métodos protegidos son accesibles, pero están destinados al uso interno
print(manager._check_permissions("example.txt"))
print("Note: Protected methods are accessible but intended for internal use only")
elif test_case == "private_access":
# Crea una instancia de FileManager
manager = FileManager()
try:
# Intenta llamar directamente al método privado
print(manager.__decrypt_content("some content"))
except AttributeError as e:
print(f"Error: {e}")
print("Private methods are name-mangled and cannot be accessed directly")
# Accede mediante la forma con el nombre modificado
print(manager._FileManager__decrypt_content("some content"))
print("Note: Accessed private method using name-mangled form")
elif test_case == "method_chaining":
# Crea una instancia de FileManager
manager = FileManager()
# Muestra cómo get_file_content llama internamente tanto a métodos protegidos como privados
print("Calling get_file_content which internally uses protected and private methods:")
print(manager.get_file_content("example.txt"))
elif test_case == "multiple_files":
# Crea una instancia de FileManager
manager = FileManager()
# Procesa varios archivos
files = ["document.txt", "image.jpg", "data.csv"]
for file in files:
print(f"\
Processing {file}:")
print(manager.read_file(file))
print(manager.get_file_content(file))
elif test_case == "name_mangling":
# Crea una instancia de FileManager
manager = FileManager()
# Muestra la modificación de nombres
print("Python's name mangling for private methods:")
print("Attempting direct access would fail with AttributeError")
print("Using mangled name:")
print(manager._FileManager__decrypt_content("private data"))
print("\
Name mangling is Python's mechanism to prevent accidental access")
print("It renames __method to _ClassName__method internally")Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación orientada a objetos
1Fundamentos de la POO
Introducción a la POOArchivos externosClases vs. objetosEl parámetro selfMétodosAtributosMétodo constructor (__init__)Repaso: calculadora sencilla4Herencia
Herencia básicaLa función super()Sobrescritura de métodosHerencia múltipleOrden de resolución de métodosRepaso: jerarquía de empleados7Métodos especiales
Introducción a los métodos mágicosSobrecarga de operadoresMétodos mágicos de contenedoresRepaso: lista personalizada10Patrones de diseño, parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón Strategy2Decoradores
Introducción a los decoradoresDecorador de propiedadDecorador de método estáticoDecorador de método de clase5Polimorfismo
Repaso de la sobrescritura de métodosTipado patoClases y métodos abstractosDiseño de interfacesRepaso: calculadora de formas8Conceptos avanzados de POO
Composición frente a herenciaMixinsMétodos estáticos y de claseDecoradores de claseGestores de contexto11Patrones de diseño, parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón Composite3Propiedades de clase
Variables de instancia vs. variables de claseDecoradores de propiedadesAtributos privadosRepaso: gestor de cuentas bancarias6Encapsulamiento
Miembros públicos, protegidos y privadosModificadores de accesoOcultación de informaciónDecoradores de propiedades avanzadosRepaso: sistema de registros de estudiantesPractica por tu cuenta: Compilador de Python online