单下划线开头(_var
)
- 语义:
- 表示该变量是一个“内部使用”的变量。这只是一种约定俗成的命名规范,用来告知其他开发者这个变量主要是模块内部使用,不建议在模块外部直接访问,但在语法上并没有真正限制外部访问。
- 类继承关系中的表现:
- 子类可以直接访问父类中以单下划线开头的变量。例如:
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
)
- 语义:
- 表示该变量是类的私有变量。Python 采用名称改写(name mangling)机制来模拟私有变量,以防止在外部直接访问。实际上,双下划线开头的变量在类外部访问时会被重命名。
- 类继承关系中的表现:
- 子类无法直接访问父类中以双下划线开头的变量。例如:
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)