随便拿一份Python代码,几乎都可以看到很多“_”的身影。
在Python中,下划线(_)有多种用途和含义,具体取决于它们的位置和使用方式。在这里都列举出来方便大家对照查看:
这种形式通常用于特殊方法和属性,也称为“魔法方法”或“双下划线方法”。这些方法和属性是Python内置的,具有特殊的含义和用途。例如:
1 2 3 4 5 6 7 8 9 |
class MyClass: def __init__(self, value): self.value = value def __str__(self): return f"MyClass with value {self.value}"
obj = MyClass(10) print(obj) # 输出: MyClass with value 10 |
单下划线前缀通常用于表示内部变量或方法,提示开发者这些变量或方法是内部实现的一部分,不应该直接访问或修改。这是一种命名约定,并不会真正限制访问。
1 2 3 4 5 6 7 8 9 |
class MyClass: def __init__(self, value): self._internal_value = value
def get_value(self): return self._internal_value
obj = MyClass(10) print(obj._internal_value) # 输出: 10 |
单下划线后缀通常用于避免与Python关键字冲突。例如,如果你有一个变量名与Python关键字冲突,可以使用单下划线后缀来避免冲突。
1 2 3 |
class_ = "MyClass" print(class_) # 输出: MyClass |
双下划线前缀会触发名称修饰(name mangling),将变量或方法名修改为_ClassName__xxx,以避免子类意外覆盖父类的私有变量或方法。这种方式提供了一种弱的“私有”机制。
1 2 3 4 5 6 7 8 9 |
class MyClass: def __init__(self, value): self.__private_value = value
def get_value(self): return self.__private_value
obj = MyClass(10) print(obj._MyClass__private_value) # 输出: 10 |
单下划线通常用作临时变量或忽略变量的占位符。例如,在循环中忽略循环变量,或在解包时忽略某些值。
1 2 3 4 5 |
for _ in range(5): print("Hello")
a, _, c = (1, 2, 3) print(a, c) # 输出: 1 3 |
双下划线通常不单独使用,但在某些情况下可能会出现在特殊方法或属性中。例如,__all__用于定义模块的公共接口。
1 |
__all__ = ["MyClass", "my_function"] |
这种形式通常不常见,但有时用于表示内部变量或方法,类似于单下划线前缀。
1 2 3 4 5 6 7 8 |
class MyClass: def __init__(self, value): self._value_ = value def get_value(self): return self._value_
obj = MyClass(10) print(obj._value_) # 输出: 10 |
顺便提一下其他的除了运算符以外的常见符号:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# 注释 a = [1, 2, 3] # 列表 b = (1, 2, 3) # 元组 c = {1, 2, 3} # 集合 d = {'a': 1, 'b': 2} # 字典
# 函数调用 def my_function(x): return x + 1
print(my_function(5)) # 输出: 6
# 切片 print(a[1:3]) # 输出: [2, 3]
# 集合操作 e = {3, 4, 5} print(c | e) # 输出: {1, 2, 3, 4, 5} print(c & e) # 输出: {3} print(c - e) # 输出: {1, 2} print(c ^ e) # 输出: {1, 2, 4, 5} |