在Python中,双下划线(__)前缀的属性名称表示名称改写(Name Mangling),这是一种用于实现类属性“伪私有化”的机制。
-
名称改写的规则
当属性名以双下划线开头(且不以双下划线结尾,如__x__),Python会自动在属性名前加上_类名作为前缀。
例如:
pythonclass Person:
def init(self, height, weight):
self.__height = height # 实际会被改写成 _Person__height
self.__weight = weight # 实际会被改写成 _Person__weight外部访问obj.__height会报错,但可以通过obj._Person__height间接访问(虽然不推荐)。
-
设计目的
避免子类属性冲突:防止父类和子类的同名属性意外覆盖。
pythonclass Parent:
def init(self):
self.__private = 1 # 实际是 _Parent__privateclass Child(Parent):
def init(self):
super().init()
self.__private = 2 # 实际是 _Child__private(不会覆盖父类的属性)并非真正的私有:Python没有严格的私有属性,名称改写只是约定性的保护机制。
-
对比其他命名约定
单下划线(_x):约定性的“保护属性”,提示开发者“不要随意访问”,但无语法限制。
双下划线(__x):触发名称改写,提供一定隔离性。
双下划线开头和结尾(x):特殊方法(如__init__),由Python定义。
-
何时使用双下划线?
当需要确保属性在类继承体系中不被子类意外覆盖时。
多数情况下,单下划线(_x)足以表达“受保护”的意图,更常用。
示例验证
python
class Test:
def init(self):
self.__secret = "hidden"
obj = Test()
print(dir(obj)) # 输出中可以看到 '_Test__secret',而非 '__secret'

浙公网安备 33010602011771号