Модификаторы доступа в python

В Python существует три уровня модификаторов доступа, которые определяют видимость атрибутов и методов внутри класса и вне его. Эти модификаторы предоставляют средства контроля доступа к данным и методам класса:

  1. Public (Открытый):

    • Атрибуты и методы, объявленные как открытые, доступны из любого места в программе.

    • В Python отсутствует явное ключевое слово для определения открытых атрибутов или методов. Все атрибуты и методы по умолчанию являются открытыми.

    class MyClass:
        def __init__(self, x):
            self.x = x  # Открытый атрибут
    
        def display(self):
            print(self.x)  # Открытый метод
  2. Protected (Защищенный):

    • Атрибуты и методы, объявленные как защищенные, доступны только внутри класса и его подклассов (наследников).

    • Для обозначения защищенных атрибутов и методов используется одно подчеркивание перед именем.

    class MyClass:
        def __init__(self, x):
            self._x = x  # Защищенный атрибут
    
        def _display(self):
            print(self._x)  # Защищенный метод
  3. Private (Закрытый):

    • Атрибуты и методы, объявленные как закрытые, доступны только внутри класса. Они не наследуются подклассами.

    • Для обозначения закрытых атрибутов и методов используется два подчеркивания перед именем.

    class MyClass:
        def __init__(self, x):
            self.__x = x  # Закрытый атрибут
    
        def __display(self):
            print(self.__x)  # Закрытый метод

    Обратите внимание, что в Python нет строгого ограничения доступа, и это больше связано с соглашениями и договоренностями. Например, закрытые атрибуты все равно могут быть доступны извне класса с использованием имени _Класс__атрибут. Однако, такой доступ не рекомендуется использовать и считается неэффективным подходом.

Пример обхода закрытого модификатора

Обход закрытого метода в Python с использованием имени _<класс>__метод не является хорошей практикой и может нарушать инкапсуляцию. Тем не менее, для иллюстрации приведу пример:

class MyClass:
    def __init__(self, x):
        self.__x = x  # Закрытый атрибут

    def __display(self):
        print(self.__x)  # Закрытый метод

# Создаем объект класса
obj = MyClass(42)

# Попытка обойти закрытый метод
# Не рекомендуется использовать такой способ в реальном коде
obj._MyClass__display()

Здесь мы создаем объект obj класса MyClass и пытаемся вызвать закрытый метод __display через обход, использовав имя obj._MyClass__display(). Однако, следует отметить, что такой подход не является стандартным и не рекомендуется в практике программирования на Python. Использование закрытых методов и атрибутов предполагает, что их доступ следует ограничивать в пределах класса, и использование их извне может привести к нежелательным эффектам.

Last updated