Частные, «защищенные» атрибуты в 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. Воспользовавшись следующей ссылкой, вы также поддержите меня как писателя.