📜  Python中的下划线 (_)

📅  最后修改于: 2022-05-13 01:55:30.839000             🧑  作者: Mango

Python中的下划线 (_)

以下是在Python中使用 _ 的不同地方:

  1. 单下划线:
    • 在口译员
    • 在一个名字之后
    • 在一个名字之前
  2. 双下划线:
    1. __leading_double_underscore
    2. __之前_之后__

单下划线

在解释器中:
_ 返回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