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:

  • Начинаются с __ (двойное подчеркивание).
  • Предназначены только для внутреннего использования.
  • Технически доступны через искажение имени, но их приватность следует уважать.

Это сигнал другим программистам (и вашему будущему «я»), что эти части безопасно использовать только внутри класса, а в будущем их реализацию можно менять без предупреждения.