Python 单下划线和双下划线
在 Python 中,单下划线和双下划线是用来命名变量和方法的一种约定。它们在不同的上下文中有不同的含义,用法也有所不同。在本文中,我们将详细介绍单下划线和双下划线的用法和约定。
单下划线(_)
在 Python 中,单下划线通常用于以下两个情况:
- 约定的私有变量和方法:在 Python 中,没有真正的私有变量和方法的概念,但是通过使用单下划线作为变量或方法的前缀,可以告诉其他开发者这是一个内部使用的变量或方法,不建议直接访问。例如:
class MyClass:
def __init__(self):
self._private_var = 10
def _private_method(self):
print("This is a private method.")
obj = MyClass()
print(obj._private_var) # 输出: 10
obj._private_method() # 输出: This is a private method.
在上面的例子中,_private_var
和 _private_method
被认为是约定的私有变量和方法。虽然可以直接访问它们,但是不建议这么做。
- 避免命名冲突:有时候在代码中引入了一些与 Python 内置变量或关键字同名的变量,为了避免命名冲突,可以在变量名前加上单下划线。例如:
list_ = [1, 2, 3]
print(list_) # 输出: [1, 2, 3]
def max_(a, b):
return a if a > b else b
print(max_(10, 5)) # 输出: 10
在上面的例子中,list_
和 max_
是为了避免与内置的 list
和 max
函数命名冲突而加上的下划线。
双下划线(__)
在 Python 中,双下划线通常用于以下两个情况:
- 名称修饰(Name Mangling):双下划线用于修饰类中的属性和方法,使其成为私有的,且不易被子类继承或外部访问。例如:
class MyClass:
def __init__(self):
self.__private_var = 10
def __private_method(self):
print("This is a private method.")
obj = MyClass()
print(obj.__private_var) # 报错: AttributeError: 'MyClass' object has no attribute '__private_var'
obj.__private_method() # 报错: AttributeError: 'MyClass' object has no attribute '__private_method'
在上面的例子中,__private_var
和 __private_method
被认为是私有的,不能在外部访问。
- 避免子类方法覆盖:双下划线还可以用于避免子类覆盖父类的方法名。当一个方法被定义为双下划线前缀,Python 解释器会对其进行名称修饰,以避免与子类中相同名称的方法发生冲突。例如:
class A:
def __method(self):
print("Class A")
class B(A):
def __method(self):
print("Class B")
obj = B()
obj._B__method() # 输出: Class B
在上面的例子中,__method
方法被定义为私有的,但是在子类中也有一个同名的方法。通过使用 _B__method()
的方式,可以调用子类中的方法,而不是父类的方法。
需要注意的是,双下划线前缀的名称修饰只在类定义中起作用,对于类外部使用的方法和属性,仍然可以直接访问。
总结
在 Python 中,单下划线和双下划线是用来命名变量和方法的一种约定。单下划线通常用于约定的私有变量和避免命名冲突,而双下划线用