详解Python 下划线、双下划线的涵义

  • Post category:Python

Python中下划线和双下划线有着特殊的用法。下面我们来详细讲解一下。

单下划线使用方法

在Python中,单下划线(单个前置下划线)的使用方法如下:

  1. 用于表示私有属性或方法,即想要让属性或方法在类外部不可被直接访问或调用,但是类内部可以被访问或调用。示例如下:
class Example:
    def __init__(self):
        self._secret = "This is a secret."

    def get_secret(self):
        return self._secret

ex = Example()
print(ex.get_secret())  # This is a secret.
print(ex._secret)  # 'Example' object has no attribute '_secret'

在上面的代码中,我们在示例类Example中定义了一个名为”_secret”的属性,但是在类外部,我们通过对象名访问该属性时会出现AttributeError: ‘Example’ object has no attribute ‘_secret’这个错误信息,因为该属性已被定义为私有属性。

在类内部,我们通过类的方法get_secret()来访问_secret属性,在方法内部我们可以直接调用_self属性的值。

  1. 用在名称和变量名上来表示临时或无关的变量。示例如下:
for _ in range(5):
    print("Hello, world!")

在上面的代码中,for循环中我们并不需要循环变量的值,而只是想执行循环体5次,因此我们用下划线代替了循环变量名。

双下划线使用方法

在Python中,双下划线(双个前置下划线)的使用方法如下:

  1. 用于名称修饰,使得名称成为私有名称,即该属性或方法在类外部和派生类中均不可访问。示例如下:
class Example:
    def __init__(self):
        self.__secret = "This is a secret."

    def get_secret(self):
        return self.__secret

ex = Example()
print(ex.get_secret())  # This is a secret.
print(ex._Example__secret)  # This is a secret.
print(ex.__secret)  # 'Example' object has no attribute '__secret'

在上面的代码中,我们在示例类Example中定义了一个名为”__secret”的属性,该属性被定义为私有属性。在类外部及其派生类中均不可被直接访问或调用,但是在类内部我们可以通过get_secret()方法来访问__secret属性。

由于Python对于双下划线命名方式进行了重命名,因此在类外部直接使用对象名访问__secret属性时会出现AttributeError: ‘Example’ object has no attribute ‘__secret’的错误信息。但是,我们可以通过”_类名__属性名”的方式来进行访问,如上例中的”_Example__secret”。

  1. 双下划线与单下划线组成前后缀字面量的特殊方法被Python保留。这些特殊方法,在Python中有着特定的含义。示例如下:
class Example:
    def __init__(self, a, b):
        self.a = a
        self.b = b

    def __add__(self, other):
        return Example(self.a + other.a, self.b + other.b)

ex1 = Example(1, 2)
ex2 = Example(3, 4)
ex3 = ex1 + ex2
print(ex3.a, ex3.b)  # 4 6

在上面的代码中,我们创建了一个名为Example的类,该类中定义了一个双下划线前后缀的特殊方法__add__(),用于重载加法运算符。在创建类的对象时,我们分别传入两个整数a、b。在__add__()中,我们返回了两个Example对象的a、b属性之和。