Модификаторы доступа контролируют видимость членов класса, применяя инкапсуляцию путём ограничения того, кто может их читать или вызывать.
| Модификатор | Доступен из |
|---|
public | Откуда угодно |
protected | Класса и его подклассов |
private | Только из объявляющего класса |
public class Employee {
private double salary; // internal — only Employee touches it
protected String department; // subclasses may use it
public String name; // open to all
public double getSalary() { // controlled, public read access
return salary;
}
}
salary приватен, поэтому внешний код не может его повредить; публичный getter — единственное окно внутрь.
class Demo:
def __init__(self):
self.public = 1
self._protected = 2 # convention only ("don't touch")
self.__private = 3 # name-mangled to _Demo__private
Python не применяет private — полагается на соглашения об именовании. Java/C# применяют модификаторы во время компиляции. В Java также есть package-private (по умолчанию, без ключевого слова).
Делать всё public нарушает инкапсуляцию. По умолчанию выбирайте самый ограничивающий уровень и расширяйте только когда появится реальная необходимость.
Модификаторы доступа — это конкретный инструмент, превращающий инкапсуляцию из принципа в правило, которое компилятор применяет.
Маленькая публичная поверхность означает, что меньше кода может зависеть от внутренностей, так что вы можете свободно выполнять рефакторинг без нарушения вызывающего кода.