Предыдущий урок: Функция round()
Приватные переменные — это те переменные, которые видны и доступны только в пределах класса, которому они принадлежат. В Java приватные переменные объявляются с помощью ключевого слова private
, которое дает к ним доступ только переменным и методам внутри этого же класса. Такие методы не могут быть перезаписаны извне. В Python такого нет — вместо этого используются два символа нижнего подчеркивания (__
) для любых переменной или метода, которые должны считаться приватными.
Как работают приватные переменные в Python?
На практике в Python нет приватных методов и переменных, как в Java. Здесь задействованы два символа нижнего подчеркивания в начале любой переменной или метода, которые нужно сделать приватными. Когда переменные объявляются приватными, подразумевается, что их нельзя будет изменять, как в случае с публичными. Последние доступны из любого класса, поэтому их значения могут меняться, что часто приводит к различным конфликтам. Рассмотрим на примере, как в Python используются приватные переменные.
Примеры реализации приватных переменных
Пример №1
class Mainclass:
__private_variable = 2020;
def __private_method(self):
print("Это приватный метод")
def insideclass(self):
print("Приватная переменная:", Mainclass.__private_variable)
self.__private_method()
foo = Mainclass()
foo.insideclass()
Вывод:
Приватная переменная: 2020
Это приватный метод
В программе выше есть класс Mainclass
, внутри которого имеются приватные переменные методы, объявленные с помощью двух подчеркиваний: __private_variable
и __private_method
. Получить к ним доступ можно только в пределах этого класса. Если же попробовать сделать это из другого класса, то вернется ошибка, сообщающая, что в классе нет такого атрибута. Это же можно продемонстрировать и на другом примере.
Пример №2
class Mainclass:
__private_variable = 2020
def __private_method(self):
print("Это приватный метод")
def insideclass(self):
print("Приватная переменная:", Mainclass.__private_variable)
foo = Mainclass()
foo.insideclass()
foo.__private_method()
Вывод:
Private Variable: 2020
Traceback (most recent call last):
File «C:\Python37\da.py», line 13, in
foo.__private_method()
AttributeError: ‘Mainclass’ object has no attribute ‘__private_method’
В этой программе можно обратить внимание на то, что метод приватный, но доступ к нему пытаются получить вне класса Mainclass
, поэтому возвращается ошибка, которая сообщает, что у класса нет экземпляра этого атрибута. Таким образом по умолчанию все методы и переменные внутри класса являются публичными, но методы с двумя подчеркиваниями в названии становятся приватными, и получить к ним доступ можно только внутри того же класса.
Процесс превращения переменных или методов в локальные называется «искажением данных» или «искажением имен» (data/name mangling). Он используется для избежания неоднозначности при определении имен подклассов. Это же помогает перезаписывать методы подклассов без прерывания вызовов методов внутри класса.
Настоящая приватность в Python не поддерживается, а ту, что есть, называют «слабым индикатором внутреннего использования». Для нее есть один символ нижнего подчеркивания (_
), который используется для объявления приватных переменных, методов, функций и классов в модуле.
Пример №3
class Vehicle:
def _start_engine(self):
return "Создаем мотоцикл."
def run(self):
return self._start_engine()
if __name__ == '__main__':
bike = Vehicle()
print(bike._start_engine())
print("Мотоцикл создан.")
bike.run()
print("Мотоцикл запущен.")
Вывод:
Создаем мотоцикл.
Мотоцикл создан.
Мотоцикл запущен.
В последнем примере нижнее подчеркивание используется для метода _start_engine
чтобы сделать его приватным. Но такое подчеркивание применяется не часто, потому что оно лишь подразумевает, что к этому объекту нельзя будет получить доступ извне, а двойное подчеркивание означает то же, но соблюдается строже.
Одиночное подчеркивание используется не очень часто, потому что если метод с одним подчеркиванием изменяют любую переменную класса и при этом вызывается, то возможны конфликты в работе класса. Двойное подчеркивание же (__
) широко используется для объявления приватных переменных и избежания неоднозначности при определении имен подклассов. В Python не таких приватных переменных, как в C++ или Java.
Выводы
В большей части языков программирования есть 3 модификатора доступа: публичный, приватный и защищенный. В Python они тоже есть, но работают и поддерживаются не совсем так.
Приватные переменные — это те переменные, к которым можно получить доступ внутри класса, где они были объявлены. В Python для этого есть одиночные и двойные подчеркивания, хотя вторые используются куда чаще. С их помощью можно получать доступ изнутри класса и выполнять «искажение имен».
Далее: Потоки и многопоточность