Основы Python: Объектно-ориентированное программирование (ООП)
Приватные методы и переменные
Lesson 5 of 7 • 10 XP
Keep your place in this quest
Log in or sign up for free to subscribe, follow lesson progress, and access more learning content.
В объектно-ориентированном программировании не все данные и методы предназначены для прямого доступа извне класса. Иногда нужно скрыть внутренние детали, чтобы их можно было использовать только внутри самого класса.
В Python вы можете обозначить атрибут или метод как приватный, начав его имя с двойного подчеркивания (__).
Хотя это не делает его полностью недоступным, активируется механизм, называемый искажением имени (name mangling), который изменяет имя атрибута внутри класса, чтобы затруднить доступ к нему извне.
Зачем использовать приватные члены?
Приватные атрибуты и методы:
- Помогают защитить данные от случайного изменения.
- Явно показывают, какие части класса являются внутренними и на которые внешний код полагаться не должен.
- Позволяют менять внутреннюю реализацию без нарушения работы другого кода, использующего ваш класс.
ВАЖНО: приватность в Python — это соглашение, а не принуждение. К приватным членам всё ещё можно получить доступ, если очень захотеть, но подразумевается, что вы не будете этого делать.
Пример: Класс Person
class Person:
def __init__(self, name, age):
self.name = name # Публичный атрибут
self.__age = age # Приватный атрибут
def print_name(self):
print("Name:", self.name)
def print_info(self):
self.print_name()
self.__print_age() # Вызов приватного метода внутри класса
def __print_age(self): # Приватный метод
print("Age:", self.__age)
p = Person("John", 30)
p.print_name() # Работает: Name: John
p.print_info() # Работает: Name: John Age: 30
Что если попытаться обратиться к приватному атрибуту?
Если попытаться получить доступ к приватному члену напрямую из вне класса, возникнет AttributeError:
p = Person("John", 30)
print(p.__age) # ❌ Здесь возникнет ошибка
Почему?
Потому что Python автоматически меняет имя __age на _Person__age внутри класса (искажение имени). Это предотвращает случайный доступ или конфликты с подклассами.
Как получить доступ к приватным данным (если очень нужно)
Технически, можно получить доступ к приватным членам, используя их искажённое имя:
print(p._Person__age) # 30
Но это нарушает идею приватности — так следует делать только при отладке, а не в обычной логике программы.
Приватные методы
Как и атрибуты, методы можно сделать приватными с помощью двойного подчеркивания.
В нашем примере __print_age() — приватный метод, его нельзя вызвать из вне класса:
p.__print_age() # ❌ Здесь возникнет ошибка
Однако внутри класса он работает без проблем, как видно в методе print_info().
Когда использовать приватные члены
Используйте приватные атрибуты и методы, когда:
- Хотите предотвратить случайное неправильное использование внутренних частей класса.
- Нужно контролировать доступ и изменения данных (часто в паре с методами getter и setter).
- Создаёте чёткое разделение между публичным API класса (тем, что предназначено для использования снаружи) и его внутренней реализацией.
Итоги
Приватные члены в Python:
- Начинаются с
__(двойное подчеркивание). - Предназначены только для внутреннего использования.
- Технически доступны через искажение имени, но их приватность следует уважать.
Это сигнал другим программистам (и вашему будущему «я»), что эти части безопасно использовать только внутри класса, а в будущем их реализацию можно менять без предупреждения.