Python 中定义方法名时前面加一个 _ 下划线代表什么?

在 Python 中,方法或变量名前加一个下划线 _ 有特殊的含义,通常与访问控制和命名惯例有关。以下是详细解释:

1. 单下划线 _ 前缀(_name

在方法或变量名前加一个单下划线是 一种约定,表示该方法或变量是“受保护的”(protected),不应该被外部直接访问,但它仍然是可以访问的。

含义:

示例:


class MyClass:
    def __init__(self):
        self._protected_attribute = "This is protected"

obj = MyClass()
print(obj._protected_attribute)  # 虽然可以访问,但按约定不建议这样做
    
注意:单下划线并不会真正限制访问,它只是表示“请不要随便访问我”。

2. 双下划线 __ 前缀(__name

在方法或变量名前加双下划线表示 名称修饰(Name Mangling)。Python 会将这样的属性名进行“名称重整”,以避免子类意外覆盖父类的属性。

含义:

示例:


class MyClass:
    def __init__(self):
        self.__private_attribute = "This is private"

obj = MyClass()

# 无法直接访问
# print(obj.__private_attribute)  # 报错:AttributeError

# 可以通过名称修饰后的名字访问
print(obj._MyClass__private_attribute)  # 输出:This is private
    
注意:名称修饰并非真正的“私有化”,只是为了避免意外覆盖。如果知道名称修饰规则,仍然可以访问。

3. 单下划线 _ 后缀(name_

有时为了避免与 Python 关键字冲突,变量名会以单下划线结尾。例如,如果想定义一个变量名为 class,由于 class 是 Python 的保留关键字,可以使用 class_ 作为变量名。

示例:


class MyClass:
    def __init__(self):
        self.class_ = "This avoids conflict with the keyword 'class'"

obj = MyClass()
print(obj.class_)  # 输出:This avoids conflict with the keyword 'class'
    

4. 单下划线 _(独立使用)

单下划线 _ 独立使用时,有不同的含义,取决于场景:

(1)交互式解释器中的最后一个表达式值


>>> 10 + 5
15
>>> _
15
    

(2)忽略变量值


for _ in range(5):  # 忽略循环变量
    print("Hello")

# 解包时忽略某些值
x, _, z = (1, 2, 3)  # 忽略中间的值
print(x, z)  # 输出:1 3
    

5. 双下划线前后各有一个(__name__

这种形式适用于 特殊方法内置属性,例如 __init____str____dict__ 等。这种命名方式是 Python 的约定,表示该名称是由 Python 本身定义的,不建议用户自行定义类似的名称。

示例:


class MyClass:
    def __init__(self):
        pass

print(MyClass.__name__)  # 输出:MyClass
    

总结

形式 含义
_name 受保护属性,仅供内部使用(约定,不强制)。
__name 名称修饰(伪私有),避免子类属性冲突。
name_ 避免与关键字冲突的命名方式。
_ 用于忽略变量或表示交互式解释器中的上一个结果值。
__name__ 特殊方法或属性,由 Python 定义,用户不应随意定义类似名称。

Python 是一门鼓励约定而非强制限制的语言,因此即使使用单下划线或双下划线,也仅仅是约定意义上的保护或隐藏。良好的代码习惯是尊重这些约定,而不是刻意绕过它们。