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

  • Post category:Python

Python 中有下划线(_)和双下划线(__)两种使用方法,下面分别进行详细讲解:

下划线(_)

作为变量名前缀

下划线作为变量名前缀,通常表示这个变量是私有的,即不能被外部访问。这是一种约定俗成的用法,Python 并没有真正的私有变量,通过使用下划线作为前缀,可以告诉其他人这个变量是内部使用的,不应该被使用者直接访问。

下面是一个示例:

class Person:
    def __init__(self, name):
        self._name = name

    def get_name(self):
        return self._name

    def set_name(self, name):
        self._name = name

在这个示例中,_name 表示这个变量是类 Person 内部使用的,外部不应该直接访问。如果有需要,可以通过类的方法 get_nameset_name 进行访问和修改。

在交互式环境中使用

在 Python 的交互式环境中,下划线表示上一个表达式的结果。例如:

>>> 1 + 2
3
>>> _ + 4
7

在第二行中,使用下划线直接引用了上一个表达式的结果,等价于 3 + 4

双下划线(__)

双下划线主要用于类中定义私有变量和方法。

私有变量

双下划线作为前缀的变量表示这个变量是类的私有变量,只能通过对象的方法进行访问。例如:

class Person:
    def __init__(self, name):
        self.__name = name  # 双下划线表示这个变量是私有的

    def get_name(self):
        return self.__name

在这个示例中,__name 表示这个变量是类 Person 的私有变量,只能通过方法 get_name 进行访问。

需要注意的是,Python 在解析双下划线前缀时,会自动将变量名“翻译”成 _类名__变量名 的形式,因此可以通过这种方式绕过私有变量的访问限制。例如:

p = Person('Tom')
print(p._Person__name)  # 输出 "Tom"

在这个示例中,使用了 _Person__name 的方式访问了 __name,虽然是私有变量,但是仍然能够得到正确的结果。但是这种方式不建议使用,违背了类的封装思想。

私有方法

双下划线作为前缀的方法表示这个方法是类的私有方法,只能在类的内部被访问。例如:

class Person:
    def __init__(self, name):
        self.name = name

    def __display(self):
        print(f"My name is {self.name}.")

    def say_hello(self):
        self.__display()

在这个示例中,__display 表示这个方法是类 Person 的私有方法,只能在类的内部被访问。在 say_hello 方法中通过 self.__display() 调用了私有方法。

需要注意的是,实际上 Python 在解析双下划线前缀时也会进行名称“翻译”,所以这种方式也可以绕过私有方法的访问限制。但是同样不建议这种用法,因为违背了类的封装思想。

以上就是 Python 下划线、双下划线的使用方法。在实际编程中,良好的编码习惯可以提高代码的可读性,减少出错率。因此,应该充分理解和应用这些用法。