В мире объектно-ориентированного программирования (ООП) понятия инкапсуляции и сокрытия данных играют ключевую роль в создании надежных и масштабируемых приложений. Если вы программист на Python, то эти концепции не должны быть для вас новыми. Давайте рассмотрим, что такое инкапсуляция, сокрытие данных, а также как работают геттеры и сеттеры на практических примерах.
Что такое инкапсуляция и сокрытие данных?
Инкапсуляция
Инкапсуляция — это механизм, позволяющий объединить данные и методы, работающие с этими данными, в единый объект. Этот подход имеет несколько преимуществ:
- Данные защищены от случайных изменений.
- Поддерживается чистота интерфейса класса.
Инкапсуляция — это механизм языка, позволяющий объединить данные и методы, работающие с этими данными, в единый объект, и скрыть детали реализации от пользователя.
Инкапсуляция скрывает переменные от взора пользователя и предотвращает их случайные изменения.
Что бы изменять или получать значения приватных атрибутов используются специальные методы: сеттеры и геттеры.
Сокрытие данных
Сокрытие данных входит в определение инкапсуляции и является основным принципом ООП.
Сокрытие данных обеспечивает защиту атрибутов класса от случайных изменений извне. Для этого в Python используется двойное подчеркивание перед именем атрибута.
То есть, что бы защитить атрибуты класса от случайных внешних изменений используется сокрытие данных: __count = 0.
Например, если мы определим атрибут как __count, он будет приватным и недоступным для прямого изменения извне.
Для этого перед атрибутом ставится двойное подчёркивание: __count — приватный атрибут (сокрытие данных). Сокрытие данных осуществляется подстановкой двойного подчеркивания перед атрибутом. Например: __age, __name и так далее.
Пример создания класса, с тремя приватными атрибутами:
Тот же код ниже для копирования и вставки в программу. Не забывайте про необходимый отступ пробелами в определённых местах в начале строки, так как код на сервере блога может отображаться некорректно.
class Person:
def __init__(self):
self.__age = 0 # Приватный атрибут
self.__name = "" # Приватный атрибут
self.__count = 0 # Приватный атрибут
# Геттер для получения значения приватного атрибута __count
def get_count(self):
return self.__count
# Сеттер для установки значения приватного атрибута __age
def set_age(self, age):
if age >= 0: # Проверка на валидность
self.__age = age
else:
print("Возраст не может быть отрицательным!")
def get_age(self):
return self.__age
В этом коде мы создали класс Person, который содержит три приватных атрибута: __age, __name и __count. Для доступа к приватным данным мы используем геттеры и сеттеры.
Геттеры и Сеттеры
Геттеры и сеттеры — это специальные методы, которые позволяют получать и устанавливать значения приватных атрибутов класса.
- Геттер — метод для получения значения атрибута.
- Сеттер — метод для установки значения атрибута.
Пример использования:
person = Person()
person.set_age(25) # Устанавливаем возраст
print(person.get_age()) # Получаем возраст
Для получения скрытых данных используется метод геттера:
Название метода геттера идёт от названия первого слова get.
Метод get переводится как «получить». И он получает информацию из скрытого атрибута.
def set_age(self, age): # Метод, который мы написали, называется сеттером. Сеттер от слова set — «установить». Название метода сеттера идёт от названия первого слова set.
Сеттер в Python — это метод, который позволяет установить или изменить значение закрытого атрибута (свойства).
Теперь мы можем изменить значение скрытого атрибута.
При сокрытии данных в Python __ двойное нижнее подчёркивание перед именем — это соглашение между программистами. Это не синтаксическое правило языка. И при желании его можно проигнорировать и нарушить.
Согласно договоренности, если поле или метод имеют два знака подчёркивания перед именем, а не после имени, то этот атрибут или метод предусмотрен исключительно для внутреннего использования.
На самом деле мы лишь имитируем сокрытие атрибутов. В Python сокрытие данных лишь имитируется. При желании со значением приватного атрибута можно работать напрямую. Но это крайне не рекомендуется.
Используя обращение к классу нижнее подчёркивание и ещё одно обращение мы все-таки можем получить приватный атрибут, но так делать не рекомендуется: print(Person._Person__count).
Таким образом, приватные значения атрибутов можно получать и изменять только через вызов геттера и сеттера. Это позволяет защитить данные от случайных изменений.
Приватными могут быть не только атрибуты, но и методы класса.
Защита атрибутов
Как было упомянуто, если перед атрибутом класса поставить двойное подчеркивание, он станет приватным. Например, атрибут __count недоступен за пределами класса:
Тем не менее, как и во многих языках, в Python приватность — это скорее соглашение. Вы всё ещё можете получить доступ к приватным атрибутам, используя следующий синтаксис:
print(person._Person__count) # Получаем значение приватного атрибута, что не рекомендуется
Рекомендации по усовершенствованию кода
- Используйте исключения: Для обработки ошибок старайтесь использовать исключения вместо простых выводов сообщений. Например, при установке возраста вместо печати сообщения об ошибке, можно вызвать исключение.
- Полная защита данных: Используйте свойства (property) в Python, чтобы упростить интерфейс доступа к атрибутам.
- Документируйте код: Добавляйте комментарии и документацию к классам и методам, чтобы сделать их более понятными для других программистов.
Заключение
Инкапсуляция и сокрытие данных являются важными аспектами программирования на Python. Они позволяют защитить внутренние состояния объектов и дают возможность управлять доступом к данным. Используя геттеры и сеттеры, вы можете создавать безопасный и удобно управляемый интерфейс для своих классов. Помните, что сокрытие данных — это не просто метод, а важный аспект проектирования класса, который помогает поддерживать чистоту и надежность вашего кода.
ПОЛЕЗНЫЕ РЕСУРСЫ:
---------------------------------------------------
Сообщество дизайнеров в VK
https://vk.com/grafantonkozlov
Телеграмм канал сообщества
https://t.me/grafantonkozlov
Архив эксклюзивного контента
https://boosty.to/antonkzv
Канал на Дзен
https://dzen.ru/grafantonkozlov
---------------------------------------------------
Бесплатный Хостинг и доменное имя
https://tilda.cc/?r=4159746
Мощная и надежная нейронная сеть Gerwin AI
https://t.me/GerwinPromoBot?start=referrer_3CKSERJX
GPTs — плагины и ассистенты для ChatGPT на русском языке
https://gptunnel.ru/?ref=Anton
---------------------------------------------------