Частные, «защищенные» атрибуты в Python - раз и навсегда демистифицированы

Все, что нужно знать о частных и «защищенных» атрибутах, в 748 словах

Никогда и никогда не используйте два ведущих символа подчеркивания. Это досадно личное. - Ян Бикинг, создатель pip, virtualenv и многих других.

Сколько раз вы встречали эти слова: Public, Private и Protected в мире Python? И сколько раз эти ведущие подчеркивания _, два ведущих подчеркивания __ озадачивали вас, пытаясь разобраться в них?

Что ж, давайте демистифицировать их раз и навсегда. Какая польза от закрытых и защищенных атрибутов. И как они выглядят в мире Python.

В чем вообще смысл частного атрибута?

Рассмотрим следующий сценарий: у вас есть класс с именем Vehicle, который внутренне использует атрибут экземпляра с именем horn и не хочет его раскрывать . Теперь вы хотите создать подкласс Vehicle и назвать свой собственный класс MyCar.

Если вы создадите свой собственный horn атрибут экземпляра внутри класса MyCar, вы переопределите атрибут экземпляра horn Vehicle. Как следствие, вы сломаете все методы в Vehicle классе , которые используют атрибут horn . Что еще хуже, было бы головной болью отлаживать возникающие проблемы.

Чтобы предотвратить такие сценарии, разработчик класса Vehicle сделает атрибут horn закрытым, чтобы предотвратить такие непреднамеренные происшествия.

Частные атрибуты в Python

В мире Python, в отличие от Java, нет способа создать модификатор private. Python предоставляет простой механизм для предотвращения случайного переопределения атрибута в вашем классе, если кто-то хочет наследовать от вашего класса.

В предыдущем примере, если вы хотели сделать атрибут horn закрытым, вам нужно было бы поставить перед ним два символа подчеркивания: __horn . Таким образом, Python сохранит это имя атрибута в экземпляре __dict__ с префиксом подчеркивание и имя класса. Таким образом, в классе Vehicle ваш __horn атрибут становится _vehicle__horn , а в классе MyCar становится _MyCar__horn. Эта особенность python носит деликатное название. из искажения имени. Вот код того, что мы обсуждали до сих пор:

Здесь важно отметить, что изменение имени - это все безопасность, а не безопасность. Это не защитит вас от умышленных нарушений; просто, случайное игнорирование. В приведенном выше примере вы можете легко изменить значение частного атрибута, просто сделав следующее: v1._vehicle__horn = 'new value'.

«Защищенные» атрибуты в Python

Питонистам не нравится ни функция искажения имен, ни искаженный вид имен, записанных как self.__horn . В общедоступных репозиториях вы заметите, что разработчики часто предпочитают следовать соглашению о добавлении только одного ведущего подчеркивания (self._horn), чтобы «защитить» их от непреднамеренного изменения.

Критики полагают, что для предотвращения искажения атрибутов достаточно просто придерживаться соглашения о добавлении атрибута в начале одного символа подчеркивания. Вот полная цитата Яна Бикинга, которую я процитировал в начале статьи;

Никогда и никогда не используйте два ведущих символа подчеркивания. Это досадно личное. Если конфликты имен вызывают беспокойство, используйте вместо этого явное искажение имен (например, _MyThing_balabla). По сути, это то же самое, что и двойное подчеркивание, только оно прозрачно там, где двойное подчеркивание скрывает.

Я должен отметить, что атрибут с одним начальным подчеркиванием _ не означает ничего особенного для интерпретатора python. Но это одна из самых строгих традиций в мире питонистов. Если вы его видите, это означает, что вам не следует обращаться к таким атрибутам извне класса. Вы даже можете заметить, что даже в некоторых уголках официальной документации Python атрибуты с одним начальным подчеркиванием _ называются защищенными.

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

В сумме

Главная цель сделать атрибут частным - предотвратить случайное переопределение этого атрибута подклассами. Официальный способ сделать переменную частной в python - добавить два символа подчеркивания, например, self.__privateattr. Но в сообществе python настоятельно рекомендуется просто добавить один символ подчеркивания в начале при создании переменной частной. Вы часто можете слышать или видеть, что такие атрибуты называются «защищенными».

Итак, просто знайте, что создание частной переменной в python связано с безопасностью, и этого достаточно, чтобы защитить их от непреднамеренного переопределения, добавив один ведущий знак подчеркивания: например, self._protected.

Если вам понравилась моя статья и вы хотите узнать больше, рассмотрите возможность регистрации, чтобы стать средним участником. Это 5 долларов в месяц, что дает вам неограниченный доступ к историям на Medium. Воспользовавшись следующей ссылкой, вы также поддержите меня как писателя.