Python 单下划线和双下划线

在 Python 中,单下划线和双下划线是用来命名变量和方法的一种约定。它们在不同的上下文中有不同的含义,用法也有所不同。在本文中,我们将详细介绍单下划线和双下划线的用法和约定。

单下划线(_)

在 Python 中,单下划线通常用于以下两个情况:

  1. 约定的私有变量和方法:在 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 被认为是约定的私有变量和方法。虽然可以直接访问它们,但是不建议这么做。

  1. 避免命名冲突:有时候在代码中引入了一些与 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_ 是为了避免与内置的 listmax 函数命名冲突而加上的下划线。

双下划线(__)

在 Python 中,双下划线通常用于以下两个情况:

  1. 名称修饰(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 被认为是私有的,不能在外部访问。

  1. 避免子类方法覆盖:双下划线还可以用于避免子类覆盖父类的方法名。当一个方法被定义为双下划线前缀,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 中,单下划线和双下划线是用来命名变量和方法的一种约定。单下划线通常用于约定的私有变量和避免命名冲突,而双下划线用