_
下划线代表什么?在 Python 中,方法或变量名前加一个下划线 _
有特殊的含义,通常与访问控制和命名惯例有关。以下是详细解释:
_
前缀(_name
)在方法或变量名前加一个单下划线是 一种约定,表示该方法或变量是“受保护的”(protected),不应该被外部直接访问,但它仍然是可以访问的。
class MyClass:
def __init__(self):
self._protected_attribute = "This is protected"
obj = MyClass()
print(obj._protected_attribute) # 虽然可以访问,但按约定不建议这样做
注意:单下划线并不会真正限制访问,它只是表示“请不要随便访问我”。
__
前缀(__name
)在方法或变量名前加双下划线表示 名称修饰(Name Mangling)。Python 会将这样的属性名进行“名称重整”,以避免子类意外覆盖父类的属性。
__name
替换为 _ClassName__name
,以实现一种“伪私有”的效果。
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
注意:名称修饰并非真正的“私有化”,只是为了避免意外覆盖。如果知道名称修饰规则,仍然可以访问。
_
后缀(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'
_
(独立使用)单下划线 _
独立使用时,有不同的含义,取决于场景:
>>> 10 + 5
15
>>> _
15
for _ in range(5): # 忽略循环变量
print("Hello")
# 解包时忽略某些值
x, _, z = (1, 2, 3) # 忽略中间的值
print(x, z) # 输出:1 3
__name__
)这种形式适用于 特殊方法 或 内置属性,例如 __init__
、__str__
、__dict__
等。这种命名方式是 Python 的约定,表示该名称是由 Python 本身定义的,不建议用户自行定义类似的名称。
class MyClass:
def __init__(self):
pass
print(MyClass.__name__) # 输出:MyClass
形式 | 含义 |
---|---|
_name |
受保护属性,仅供内部使用(约定,不强制)。 |
__name |
名称修饰(伪私有),避免子类属性冲突。 |
name_ |
避免与关键字冲突的命名方式。 |
_ |
用于忽略变量或表示交互式解释器中的上一个结果值。 |
__name__ |
特殊方法或属性,由 Python 定义,用户不应随意定义类似名称。 |
Python 是一门鼓励约定而非强制限制的语言,因此即使使用单下划线或双下划线,也仅仅是约定意义上的保护或隐藏。良好的代码习惯是尊重这些约定,而不是刻意绕过它们。