Python не имеет частных переменных, таких как C ++ или Java. При желании вы также можете получить доступ к любой переменной-члену в любое время. Однако вам не нужны частные переменные в Python, потому что в Python неплохо выставлять переменные-члены ваших классов. Если вам необходимо инкапсулировать переменную-член, вы можете сделать это позже, используя @property, не нарушая существующий клиентский код.
В python одиночное подчеркивание _ используется для обозначения того, что метод или переменная не рассматривается как часть общедоступного API класса и что эта часть API может изменяться между разными версиями. Вы можете использовать эти методы / переменные, но ваш код может сломаться, если вы используете более новую версию этого класса.
Двойное подчеркивание __ не означает частную переменную. Вы используете его для определения переменных, которые являются локальными для класса и которые не могут быть легко переопределены подклассами. Он искажает имя переменных.
Например:
class A(object):
def __init__(self):
self.__foobar = None # will be automatically mangled to self._A__foobar
class B(A):
def __init__(self):
self.__foobar = 1 # will be automatically mangled to self._B__foobar
Имя self .__ foobar автоматически преобразуется в self._A__foobar в классе A. В классе B оно преобразуется в self._B__foobar. Таким образом, каждый подкласс может определять свою собственную переменную __foobar, не переопределяя свои родительские переменные. Но ничто не мешает вам получить доступ к переменным, начинающимся с двойного подчеркивания. Однако изменение имен не позволяет вам случайно вызвать эти переменные / методы.
Я настоятельно рекомендую посмотреть, как Раймонд Хеттингерс рассказывает о наборе инструментов разработки классов Pythons из Pycon 2013 (должен быть доступен на Youtube), который дает хороший пример, почему и как вы должны использовать переменные @property и __- instance.
Если у вас есть открытые общедоступные переменные и вам необходимо их инкапсулировать, вы можете использовать @property. Поэтому вы можете начать с самого простого из возможных решений. Вы можете оставить переменные-члены общедоступными, если у вас нет конкретной причины этого не делать. Вот пример:
class Distance:
def __init__(self, meter):
self.meter = meter
d = Distance(1.0)
print(d.meter)
# prints 1.0
class Distance:
def __init__(self, meter):
# Customer request: Distances must be stored in millimeters.
# Public available internals must be changed.
# This would break client code in C++.
# This is why you never expose public variables in C++ or Java.
# However, this is python.
self.millimeter = meter * 1000
# In python we have @property to the rescue.
@property
def meter(self):
return self.millimeter *0.001
@meter.setter
def meter(self, value):
self.millimeter = meter * 1000
d = Distance(1.0)
print(d.meter)
# prints 1.0
person
Hatatister
schedule
26.06.2018