You are currently viewing Underscore (_) in Python

Underscore (_) in Python

Ниже приведены различные места, где _ используется в Python:

  1. Одно Подчеркивание:
    • В Переводе
    • После имени
    • Перед именем
  2. Двойное подчеркивание:
    1. __leading_double_underscore
    2. __before_after__

Одно подчеркивание

В переводе:
_ returns значение последнего выполненного значения выражения в приглашении/интерпретаторе Python

>>> a = 10
>>> b = 10
>>> _
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name '_' is not defined
>>> a+b
20
>>> _
20
>>> _ * 2
40
>>> _
40
>>> _ / 2
20

Для игнорирования значений:

Несколько раз мы не хотим, чтобы возвращаемые значения в это время присваивались этим значениям для подчеркивания. Он использовался как одноразовая переменная.

# Ignore a value of specific location/index
for _ in range(10)
	print ("Test")

# Ignore a value when unpacking
a,b,_,_ = my_method(var1)

После имени

Python имеет свои ключевые слова по умолчанию, которые мы не можем использовать в качестве имени переменной. Чтобы избежать такого конфликта между ключевым словом python и переменной, мы используем подчеркивание после имени

Пример:

>>> class MyClass():
...	 def __init__(self):
...			 print ("OWK")

>>> def my_defination(var1 = 1, class_ = MyClass):
...	 print (var1)
...	 print (class_)

>>> my_defination()
1
__main__.MyClass
>>>

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

Здесь префикс имени с подчеркиванием рассматривается как непубличный. Если указать из импорта*, все имя начинается с _ не будет импортироваться. Python не указывает истинно частные, поэтому эти модули можно вызывать непосредственно из других модулей, если они указаны в __all__, мы также называем их слабыми частными

class Prefix:
...	 def __init__(self):
...			 self.public = 10
...			 self._private = 12
>>> test = Prefix()
>>> test.public
10
>>> test._private
12
def public_api():
	print ("public api")

def _private_api():
	print ("private api")

Вызов файла из приглашения

>>> from class_file import *
>>> public_api()
public api

>>> _private_api()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name '_private_api' is not defined

>>> import class_file
>>> class_file.public_api()
public api
>>> class_file._private_api()
private api

Двойное подчеркивание(__)

__leading_double_underscore, ведущее двойное подчеркивание, указывает интерпретатору python переписать имя, чтобы избежать конфликта в подклассе. Интерпретатор изменяет имя переменной с расширением класса и этой функцией, известной как Искажение.

class Myclass():
	def __init__(self):
		self.__variable = 10

Звонок от переводчика

>>> import testFile
>>> obj = testFile.Myclass()
>>> obj.__variable
Traceback (most recent call last):
File "", line 1, in
AttributeError: Myclass instance has no attribute '__variable'
nce has no attribute 'Myclass'
>>> obj._Myclass__variable
10

В интерпретаторе python для искажения измените имя переменной с ___. Поэтому несколько раз он используется в качестве закрытого члена, потому что другой класс не может получить прямой доступ к этой переменной. Основная цель _ _ — использовать переменную/метод в классе только в том случае, если вы хотите использовать его вне класса, вы можете сделать общедоступным api

class Myclass():
	def __init__(self):
		self.__variable = 10
	def func(self)
		print (self.__variable)

Звонок от переводчика

>>> import testFile
>>> obj = testFile.Myclass()
>>> obj.func()
10

__BEFORE_AFTER__

Имя, начинающееся с __ и заканчивающееся тем же, учитывает специальные методы в Python. Python предоставляет эти методы для использования в качестве перегрузки оператора в зависимости от пользователя.

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

class Myclass():
	def __add__(self,a,b):
		print (a*b)

Звонок от переводчика

>>> import testFile
>>> obj = testFile.Myclass()
>>> obj.__add__(1,2)
2
>>> obj.__add__(5,2)
10