Python 中下划线和双下划线是有特殊含义的,使用它们可以实现一些特殊的功能。
单下划线 _
在 Python 中,单下划线 _
常用于以下几种情况:
用于解决名称冲突
如果有一个变量名和 Python 中的关键字重名,但你又不想改变该变量名,就可以在名称前加上一个下划线 _
,以避免与关键字冲突,例如:
if_ = 5 # `if` 是关键字,加上下划线来做变量名
用于私有变量
在 Python 中,单下划线 _
也常用于定义私有变量,即该变量应该在类内部使用,不希望外部访问该变量。需要注意的是,单下划线并不能真正意义上限制外部访问变量,只是一种暗示作用。
class MyDemo:
def __init__(self):
self.public_var = 'public'
self._private_var = 'private'
demo = MyDemo()
print(demo.public_var) # 非私有变量,可以正常访问
print(demo._private_var) # 私有变量,也可以访问,但是不推荐
用于类型注解
在 Python 3.10 之后,单下划线 _
还可以用于类型注解中,表示一个占位符或标志注解。例如:
def foo() -> list[_]: # `_` 表示元素类型未知
return [1, 2, 3]
双下划线 __
双下划线 __
是 Python 中的魔术方法(Magic Method),用于重写类的特殊方法,例如:
class MyClass:
def __init__(self, x):
self.x = x
def __str__(self):
return f'x is {self.x}'
my_obj = MyClass(5)
print(my_obj) # 调用 __str__ 方法
除此之外,双下划线在访问和继承属性时也有特殊含义,具体如下:
名称重整
Python 中的名称重整(Name Mangling)机制会根据变量名加上类名前缀,以避免变量名冲突。双下划线在这里的作用是将名称重整成 _<class-name>__<attribute-name>
的形式,例如:
class MyClass:
def __init__(self):
self.__x = 5
my_obj = MyClass()
print(my_obj.__x) # 报错,无法访问 __x 属性
print(my_obj._MyClass__x) # 正确,MyClass 的实例属性 __x 重命名为 _MyClass__x
子类无法继承父类双下划线属性
当子类继承父类时无法访问父类中带有双下划线的属性,这是因为父类属性已经被名称重整了。例如:
class A:
__x = 5
class B(A):
def print_x(self):
print(self.__x)
b = B()
b.print_x() # 报错,无法访问 __x 属性
可以使用 _A__x
的方式来访问父类中的属性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Python 下划线、双下划线的涵义 - Python技术站