Назад к вопросам
Junior
67
questionbank

Как в Python работает соглашение по использованию атрибутов?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

В Python доступ к атрибутам объекта регулируется соглашением, основанным на префиксах имен.

  1. Публичные атрибуты: Начинаются без префикса подчеркивания. Считаются частью публичного API класса и могут быть доступны и изменены извне.
  2. Защищенные атрибуты: Начинаются с одного подчеркивания (_). Считаются внутренней частью класса или модуля. Соглашение предполагает, что такие атрибуты не должны напрямую использоваться извне, хотя технически доступны.
    class MyClass:
        def __init__(self):
            self.public_attribute = "публичный"
            self._protected_attribute = "защищенный" 
    
    obj = MyClass()
    print(obj.public_attribute) # Доступ к публичному атрибуту
    print(obj._protected_attribute) # Доступ к защищенному атрибуту (по соглашению не рекомендуется извне)
    
  3. Приватные атрибуты: Начинаются с двух подчеркиваний (__) и не заканчиваются на подчеркивание. Python выполняет "искажение имени" (name mangling): __attribute преобразуется в _ClassName__attribute. Это затрудняет прямой доступ извне, хотя и не делает его полностью невозможным.
    class AnotherClass:
        def __init__(self):
            self.__private_attribute = "приватный"
    
        def get_private(self):
            return self.__private_attribute
    
    obj2 = AnotherClass()
    # print(obj2.__private_attribute) # Вызовет AttributeError
    print(obj2.get_private()) 
    print(obj2._AnotherClass__private_attribute) # Доступ через искаженное имя (не рекомендуется)
    

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