Menu
CoddyTech

Модификаторы доступа

Часть раздела Объектно-ориентированное программирование путешествия по Python на Coddy. Урок 29 из 64.

Модификаторы доступа управляют видимостью атрибутов и методов класса. В Python для управления доступом используются соглашения об именовании, а не ключевые слова.

Вот пример публичного доступа (без префикса):

class Person:
    def __init__(self):
        self.name = "Coddy"      # Публичный атрибут
        
    def greet(self):             # Публичный метод
        return f"Hello, I'm {self.name}"

Получайте доступ к открытым членам откуда угодно:

person = Person()
print(person.name)           # Coddy
print(person.greet())        # Привет, я Coddy

Вот пример защищённого доступа (одно подчёркивание):

class Employee:
    def __init__(self):
        self._salary = 50000     # Защищённый атрибут
    
    def _calculate_bonus(self):  # Защищённый метод
        return self._salary * 0.1

    def show_bonus(self):
        return self._calculate_bonus()  # Можно использовать внутри класса

Обращение к защищённым членам (работает, но не рекомендуется):

employee = Employee()
print(employee._salary)      # 50000 - работает, но так делать не рекомендуется
print(employee.show_bonus()) # 5000.0 - правильный способ

Вот пример закрытого доступа (двойное подчёркивание):

class User:
    def __init__(self):
        self.__password = "secure123"   # Приватный атрибут
        
    def __encrypt(self, data):          # Приватный метод
        return f"Encrypted: {data}"
        
    def verify(self, input_password):
        # Приватные члены доступны внутри класса
        return input_password == self.__password

Правильно используй приватные члены:

user = User()
print(user.verify("secure123"))  # True - с использованием публичного метода
# print(user.__password)         # AttributeError - прямой доступ невозможен

Вывод:

Coddy
Hello, I'm Coddy
50000
5000.0
True

Ключевой момент: модификаторы доступа в Python — это соглашения об именовании: без префикса = открытый (доступен отовсюду), одно подчёркивание = защищённый (для внутреннего использования), два подчёркивания = приватный (только внутри класса). Они помогают установить чёткие границы и предотвратить случайное неправильное использование внутреннего устройства класса.

challenge icon

Задание

Средне

В этом задании ты реализуешь класс FileManager, демонстрирующий модификаторы доступа Python (публичный, защищённый и приватный), и познакомишься с преимуществами всестороннего тестирования.

Отредактируй filemanager.py, чтобы реализовать класс FileManager в соответствии с комментариями TODO. Файл содержит подробные инструкции по реализации:

  • Публичные методы для работы с файлами
  • Защищённые методы (с одним подчёркиванием в начале)
  • Приватные методы (с двумя подчёркиваниями в начале)
  • Взаимодействие методов, демонстрирующее инкапсуляцию

Попробуйте сами

from file_manager import FileManager

# Обработчик всех тестовых сценариев
test_case = input()

if test_case == "basic_test":
    # Создать экземпляр FileManager
    manager = FileManager()
    # Вызвать метод read_file
    print(manager.read_file("example.txt"))
    # Вызвать метод get_file_content
    print(manager.get_file_content("example.txt"))

elif test_case == "protected_access":
    # Создать экземпляр FileManager
    manager = FileManager()
    # Попробовать вызвать защищённый метод
    # Защищённые методы доступны, но предназначены для внутреннего использования
    print(manager._check_permissions("example.txt"))
    print("Note: Protected methods are accessible but intended for internal use only")

elif test_case == "private_access":
    # Создать экземпляр FileManager
    manager = FileManager()
    try:
        # Попробовать вызвать приватный метод напрямую
        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")
    
    # Получить доступ с помощью формы с преобразованным именем
    print(manager._FileManager__decrypt_content("some content"))
    print("Note: Accessed private method using name-mangled form")

elif test_case == "method_chaining":
    # Создать экземпляр FileManager
    manager = FileManager()
    # Показать, как get_file_content внутри вызывает защищённый и приватный методы
    print("Calling get_file_content which internally uses protected and private methods:")
    print(manager.get_file_content("example.txt"))

elif test_case == "multiple_files":
    # Создать экземпляр FileManager
    manager = FileManager()
    # Обработать несколько файлов
    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":
    # Создать экземпляр FileManager
    manager = FileManager()
    # Продемонстрировать преобразование имён
    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 iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор Python