在Python中,双下划线(__)前缀的属性名称表示名称改写(Name Mangling),这是一种用于实现类属性“伪私有化”的机制。

  1. 名称改写的规则

    当属性名以双下划线开头(且不以双下划线结尾,如__x__),Python会自动在属性名前加上_类名作为前缀。

    例如:
    python

    class Person:
    def init(self, height, weight):
    self.__height = height # 实际会被改写成 _Person__height
    self.__weight = weight # 实际会被改写成 _Person__weight

    外部访问obj.__height会报错,但可以通过obj._Person__height间接访问(虽然不推荐)。

  2. 设计目的

    避免子类属性冲突:防止父类和子类的同名属性意外覆盖。
    python

    class Parent:
    def init(self):
    self.__private = 1 # 实际是 _Parent__private

    class Child(Parent):
    def init(self):
    super().init()
    self.__private = 2 # 实际是 _Child__private(不会覆盖父类的属性)

    并非真正的私有:Python没有严格的私有属性,名称改写只是约定性的保护机制。

  3. 对比其他命名约定

    单下划线(_x):约定性的“保护属性”,提示开发者“不要随意访问”,但无语法限制。

    双下划线(__x):触发名称改写,提供一定隔离性。

    双下划线开头和结尾(x):特殊方法(如__init__),由Python定义。

  4. 何时使用双下划线?

    当需要确保属性在类继承体系中不被子类意外覆盖时。

    多数情况下,单下划线(_x)足以表达“受保护”的意图,更常用。

示例验证
python

class Test:
def init(self):
self.__secret = "hidden"

obj = Test()
print(dir(obj)) # 输出中可以看到 '_Test__secret',而非 '__secret'

posted @ 2025-06-13 10:25  劉半仙  阅读(38)  评论(0)    收藏  举报