You are currently viewing Частные переменные в Python

Частные переменные в Python

Предварительное условие: Подчеркивание в Python
В Python не существует “частных” переменных экземпляра, доступ к которым возможен только внутри объекта. Однако большинство программистов и программистов Python придерживаются соглашения, т. Е. Имя с префиксом подчеркивания, например _geek, должно рассматриваться как непубличная часть API или любого кода Python, будь то функция, метод или элемент данных. Проходя через это, мы также попытаемся понять концепцию различных форм завершающих подчеркиваний, например, для _ в диапазоне(10), __init__(self).

Искажение и как это работает

В Python есть нечто, называемое искажением имен, что означает, что существует ограниченная поддержка допустимого варианта использования для закрытых членов класса, в основном для того, чтобы избежать столкновения имен с именами, определенными подклассами. Любой идентификатор формы __geek (по крайней мере, два начальных подчеркивания или не более одного конечного подчеркивания) заменяется _classname__geek, где classname-это текущее имя класса с начальным подчеркиванием (- ами). Пока это происходит в рамках определения класса, это искажение выполняется. Это полезно для того, чтобы подклассы могли переопределять методы, не нарушая вызовы внутриклассовых методов.
Давайте рассмотрим этот пример и попытаемся выяснить, как работает это подчеркивание:

# Python code to illustrate how mangling works
class Map:
	def __init__(self, iterate):
		self.list = []
		self.__geek(iterate)
	def geek(self, iterate):
		for item in iterate:
			self.list.append(item)

	# private copy of original geek() method
	__geek = geek

class MapSubclass(Map):
	
	# provides new signature for geek() but
	# does not break __init__()
	def geek(self, key, value):	
		for i in zip(keys, value):
			self.list.append(i)

Правила искажения разработаны в основном для предотвращения несчастных случаев, но по-прежнему можно получить доступ или изменить переменную, которая считается закрытой. Это может быть даже полезно в особых обстоятельствах, например, в отладчике.

_Single ведущие подчеркивания

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

# Python code to illustrate
# how single underscore works
def _get_errors(self):
	if self._errors is None:
		self.full_clean()
	return self._errors

errors = property(_get_errors)

Фрагмент кода взят из исходного кода Django (django/forms/forms.py). Это говорит о том, что ошибки являются собственностью, и это также часть API, но метод _get_errors является “частным”, поэтому к нему не следует обращаться.

__Double ведущие подчеркивания

Два подчеркивания в начале вызывают много путаницы. Речь идет о синтаксисе, а не о соглашении. двойное подчеркивание искажает имена атрибутов класса, чтобы избежать конфликтов имен атрибутов между классами. 

Например:

# Python code to illustrate how double
# underscore at the beginning works
class Geek:
	def _single_method(self):
		pass
	def __double_method(self): # for mangling
		pass
class Pyth(Geek):
	def __double_method(self): # for mangling
		pass

__Double  начальное и двойное конечное underscores__

Есть еще один случай двойного подчеркивания в начале и в конце. Мы следуем этому, используя специальные переменные или методы (называемые “магическим методом”), такие как__len__, __init__. Эти методы придают именам особые синтаксические особенности. Например, __file__  указывает местоположение файла Python, __eq__ выполняется при выполнении выражения a == b.

Пример: 

# Python code to illustrate double leading and
# double trailing underscore works
class Geek:

	# '__init__' for initializing, this is a
	# special method
	def __init__(self, ab):
		self.ab = ab

	# custom special method. try not to use it
	def __custom__(self):
		pass