MST
星途 面试题库

面试题:Python 中单下划线和双下划线在命名上的语义区别

请阐述在 Python 中,单下划线开头(如 _var)和双下划线开头(如 __var)的变量命名在语义上有什么不同,在类的继承关系中又会有怎样不同的表现?
21.3万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

单下划线开头(_var

  1. 语义
    • 表示该变量是一个“内部使用”的变量。这只是一种约定俗成的命名规范,用来告知其他开发者这个变量主要是模块内部使用,不建议在模块外部直接访问,但在语法上并没有真正限制外部访问。
  2. 类继承关系中的表现
    • 子类可以直接访问父类中以单下划线开头的变量。例如:
class Parent:
    def __init__(self):
        self._internal_var = 10


class Child(Parent):
    def print_internal_var(self):
        print(self._internal_var)


child = Child()
child.print_internal_var()
- 上述代码中,子类 `Child` 可以访问父类 `Parent` 的 `_internal_var` 变量。

双下划线开头(__var

  1. 语义
    • 表示该变量是类的私有变量。Python 采用名称改写(name mangling)机制来模拟私有变量,以防止在外部直接访问。实际上,双下划线开头的变量在类外部访问时会被重命名。
  2. 类继承关系中的表现
    • 子类无法直接访问父类中以双下划线开头的变量。例如:
class Parent:
    def __init__(self):
        self.__private_var = 20


class Child(Parent):
    def print_private_var(self):
        # 这行代码会报错,因为无法直接访问父类的私有变量
        print(self.__private_var)


child = Child()
child.print_private_var()
- 上述代码运行时,`print(self.__private_var)` 会引发 `AttributeError` 错误,因为子类不能直接访问父类的私有变量。但是,通过名称改写规则,可以在外部以 `_类名__变量名` 的形式访问,不过这种方式不推荐。例如:
class Parent:
    def __init__(self):
        self.__private_var = 20


parent = Parent()
# 通过名称改写访问私有变量
print(parent._Parent__private_var)