Python中的下划线 (_)
以下是在Python中使用 _ 的不同地方:
- 单下划线:
- 在口译员
- 在一个名字之后
- 在一个名字之前
- 双下划线:
- __leading_double_underscore
- __之前_之后__
单下划线
在解释器中:
_ 返回Python Prompt/Interpreter 中最后执行的表达式值的值
>>> a = 10
>>> b = 10
>>> _
Traceback (most recent call last):
File "", line 1, in
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
>>>
在一个名字之前
变量/函数/方法名称前的下划线向程序员表明它仅供内部使用,可以随时修改。
这里下划线的名称前缀被视为非公共的。如果从 Import *指定所有以 _ 开头的名称将不会导入。 Python没有指定真正的私有,所以如果在__all__中指定,可以直接从其他模块调用,我们也称它为弱私有
class Prefix:
... def __init__(self):
... self.public = 10
... self._private = 12
>>> test = Prefix()
>>> test.public
10
>>> test._private
12
Python类文件.py
def public_api():
print ("public api")
def _private_api():
print ("private api")
从 Prompt 调用文件
>>> from class_file import *
>>> public_api()
public api
>>> _private_api()
Traceback (most recent call last):
File "", line 1, in
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解释器重写名称以避免子类中的冲突。解释器使用类扩展名更改变量名,该功能称为Mangling。
测试文件.py
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
在 Mangling Python解释器中用 ___ 修改变量名。所以多次它用作 Private成员,因为另一个类不能直接访问该变量。 __ 的主要目的是仅在类中使用变量/方法如果你想在类之外使用它,你可以公开 api
class Myclass():
def __init__(self):
self.__variable = 10
def func(self)
print (self.__variable)
来自口译员的电话
>>> import testFile
>>> obj = testFile.Myclass()
>>> obj.func()
10
__之前_之后__
以 __ 开头并以相同结尾的名称考虑了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