[TOC]

单个下划线

  • 在命令行里输入单个下划线表示上一次的表达式

  • 用作数值字面量中的千位分隔符,提高可读性

    1
    number = 1_000_000
  • 用作临时变量名,常用来表示不需要使用的变量,在循环遍历中使用。

    1
    2
    3
    4
    5
    6
    # 情况1
    for _ in range(5):
    print('hello World!')

    # 情况2
    x, _, z = (1,2,3)
  • 用作国际化(i18n)函数的翻译标记:在一些国际化库中,下划线常常用于标记需要进行翻译的字符串。

    1
    2
    3
    from gettext import gettext as _

    print(_("Hello World"))

前缀单下划线 _name

1
2
3
4
5
6
7
8
9
10
11
#仅模块内方法调用
#标记类的私有属性和方法
#当一个方法有前缀_,则该方法在被import时也不能被调用。
def _func():
print(name)
#例如设置一个类
class test():
def __init__(self):
self.name='lbw'
def _func():
print(name)

后缀单下划线 name_

1
如果想使用python内置变量名,例如class、print,可以加一个_来区分,class_、print_

双下划线

前缀双下划线 __name

重整(name mangling):以双下划线开头的名称会被重命名为_类名__名称的形式,其中类名是包含该名称的类的名称,而名称是原始名称去掉双下划线开头的部分。

确保不同类中具有相同双下划线前缀的属性或方法不会发生冲突。使用双下划线开头的名称,可以有效地将其视为类的私有成员,不应该被外部代码直接访问或重写。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class A:
def __init__(self):
self.__private_var = 10

def __private_method(self):
print("This is a private method.")

class B(A):
def __init__(self):
super().__init__()
self.__private_var = 20

def __private_method(self):
print("This is a private method in B.")

a = A()
b = B()

print(a.__private_var) # 无法直接访问原始的私有变量名
# 输出:AttributeError: 'A' object has no attribute '__private_var'

print(a._A__private_var)
# 输出:10

print(b._B__private_var) # 使用名称重整的方式访问私有变量
# 输出:20

a.__private_method() # 无法直接访问原始的私有方法名
# 输出:AttributeError: 'A' object has no attribute '__private_method'

a._A__private_method()
# 输出:This is a private method.

b._B__private_method() # 使用名称重整的方式访问私有方法
# 输出:This is a private method in B.

前后缀双下划线_name_

魔术方法,这些方法在类定义中具有特殊的含义,并通过特定的调用方式进行调用。

例如,__init__是用于初始化实例的构造函数,__str__用于自定义对象的字符串表示,__add__用于自定义对象的加法操作等等。