Модификаторы доступа
Часть раздела Объектно-ориентированное программирование путешествия по 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 — это соглашения об именовании: без префикса = открытый (доступен отовсюду), одно подчёркивание = защищённый (для внутреннего использования), два подчёркивания = приватный (только внутри класса). Они помогают установить чёткие границы и предотвратить случайное неправильное использование внутреннего устройства класса.
Задание
СреднеВ этом задании ты реализуешь класс 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")В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Введение в ООПВнешние файлыКлассы и объектыПараметр selfМетодыАтрибутыМетод-конструктор (__init__)Повторение — простой калькулятор4Наследование
Основы наследованияФункция super()Переопределение методовМножественное наследованиеПорядок разрешения методовПовторение: иерархия сотрудников7Специальные методы
Введение в магические методыПерегрузка операторовМагические методы контейнеровПовторение — пользовательский список10Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн «Одиночка»Паттерн «Фабрика»Паттерн «Наблюдатель»Паттерн «Стратегия»2Декораторы
Введение в декораторыДекоратор свойстваДекоратор статического методаДекоратор метода класса5Полиморфизм
Переопределение методов: повторениеУтиная типизацияАбстрактные классы и методыПроектирование интерфейсовПовторение — калькулятор фигур8Продвинутые концепции ООП
Композиция и наследованиеМиксиныСтатические методы и методы классаДекораторы классовМенеджеры контекста11Паттерны проектирования. Часть 2
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»3Свойства классов
Переменные экземпляра и классаДекораторы свойствПриватные атрибутыПовторение — менеджер банковского счёта6Инкапсуляция
Публичные, защищённые и приватные членыМодификаторы доступаСокрытие информацииПродвинутые декораторы свойствПовторение — система учёта студентов12Проект: Система управления библиотекой
Обзор проектаКлассы книг и пользователейСистема выдачи книгФункция поискаИнтерфейс администратораТестирование и интеграцияПотренируйтесь самостоятельно: Онлайн-компилятор Python