Има ли “private” или нещо подобно в Python

Официално в Python няма модификатори за достъп, подобно на други широко познати езици за Обектно-Ориентирано Програмиране (напр. Public, Protected, Private и др.). По подразбиране в Python всичко е достъпно.
Нека разгледаме следният клас и как можем да достъпваме обектните данни:

class A():
  def __init__(self, var):
    self.var = var

obj = A(1024)
print(obj.var)

Както виждаме нищо не ни пречи да се обърнем директно към променливата var.
Изход:

Python 3.6.1 (default, Dec 2015, 13:05:11)
1024

Има възможност за т.нар. “скриване” на оектната променлива var. Това се постига като в __init__ метода я дефинираме с двойна подчертавка “__” в началот на името и. Нека променим дефиницията на класа А:

class A():
  def __init__(self, var):
    self.__var = var

obj = A(1024)
print(obj.__var)

Дефинирано така не можем да се обърнем директно към променливата __var на обект от клас А и получаваме съобщение за грешка че така променлива не съществува.
Изход:

Python 3.6.1 (default, Dec 2015, 13:05:11)
Traceback (most recent call last):
  File "main.py", line 6, in <module>
    print(obj.__var)
AttributeError: 'A' object has no attribute '__var'

Въпреки това тази променлива __var е достъпна от методите на класа. Пример за използването на този подход за реализиране на “private” променлива в Python:

class A():
  def __init__(self, var):
    self.__var = var
  def __str__(self):
    return str(self.__var)
obj = A(1024)
print(obj)

Изход:

Python 3.6.1 (default, Dec 2015, 13:05:11)
1024

Има и други начини за “скриване” на променливи в Python. Съществуват и подходи познати на повечето като getter и setter, но те се постигат чрез използването на т.нар. декоратори в Python.

*за съжаление обаче съществува вариатн за директен достъп дори и до променливи девинирани с двойна подчертавка в началото на името.