Menu
CoddyTech

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 Coddy

Aquí 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 clase

Accede 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 correcta

Aquí 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.__password

Usa 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 directamente

Salida:

Coddy
Hello, I'm Coddy
50000
5000.0
True

Punto 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.

challenge icon

Desafío

Intermedio

En 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")
quiz iconPonte a prueba

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

Practica por tu cuenta: Compilador de Python online