Ниже приведены различные места, где _ используется в Python:
- Одно Подчеркивание:
- В Переводе
- После имени
- Перед именем
- Двойное подчеркивание:
- __leading_double_underscore
- __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