网易首页 > 网易号 > 正文 申请入驻

Python:名称改写

0
分享至

在 Python 中,类的属性和方法名可以使用下划线来表达不同的含义。

其中,双前导下划线(__name)但不以双下划线结尾的名字会触发一种机制,称为“名称改写”(Name Mangling)。

名称改写的主要作用是:在类定义阶段,Python 会自动将这类名字改写为 _类名__name 的形式,从而避免在继承关系中被子类意外覆盖。

一、名称改写的规则

1、触发条件

仅当名字以两个下划线开头(__name),但不以两个下划线结尾时才会触发。

比如:

__attr → 会被改写。

__attr__ → 不会被改写(保留给特殊方法)。

_attr → 不会被改写,只是“内部使用”的约定。

2、改写时机

名称改写发生在类定义阶段,即类体执行时。

Python 会根据类名生成改写后的名字,因此相同的 __name 在不同的类中会得到不同的改写结果。

3、改写规则

在类定义时,将 __name 改写为 _类名__name。

4、完整示例

class Demo:
    def __init__(self):
        self.__hidden = 123   # 双前导下划线属性

    def __private_method(self):  # 双前导下划线方法
        return "这是私有方法"

    def access(self):
        # 在类内部,依旧用定义时的名字即可
        return self.__hidden, self.__private_method()


d = Demo()

# 1. 实例字典中的实际存储
print(d.__dict__)
# {'_Demo__hidden': 123}

# 2. 类字典中的方法名称
print([name for name in Demo.__dict__ if "private" in name])
# ['_Demo__private_method']

# 3. 外部直接访问会报错
# print(d.__hidden)           # AttributeError
# print(d.__private_method()) # AttributeError

# 4. 可以通过改写后的名字访问
print(d._Demo__hidden)           # 123
print(d._Demo__private_method()) # 这是私有方法

# 5. 在类内部调用仍然正常
print(d.access())                # (123, '这是私有方法')

(1)定义时写的是 __hidden,但存储在实例字典里时变成了 _Demo__hidden。

(2)定义时写的是 __private_method,在类字典里变成了 _Demo__private_method。

(3)类内部写 self.__hidden 时,Python 会自动替换成 _Demo__hidden,所以访问正常。

(4)类外访问时,必须显式写改写后的名字才能成功。

二、避免子类覆盖

如果没有名称改写,子类可能会无意中覆盖父类的属性或方法。

class Base:
    def __init__(self):
        self.value = 100   # 普通属性

class Child(Base):
    def __init__(self):
        super().__init__()
        self.value = 200   # 覆盖了父类的同名属性

c = Child()
print(c.value)  # 200(父类的值被覆盖)

使用双前导下划线,就能避免这种冲突:

class Base:
    def __init__(self):
        self.__value = 100   # 实际改写为 _Base__value

    def get_value(self):
        return self.__value

class Child(Base):
    def __init__(self):
        super().__init__()
        self.__value = 200   # 实际改写为 _Child__value

c = Child()
print(c.get_value())        # 100(父类方法仍然访问 _Base__value)
print(c.__dict__)           # {'_Base__value': 100, '_Child__value': 200}

父类和子类各自拥有独立的属性,不会互相覆盖。

三、方法中的名称改写

class A:
    def __private_method(self):
        print("A.__private_method called")

    def call(self):
        self.__private_method()

class B(A):
    def __private_method(self):
        print("B.__private_method called")

b = B()
b.call()
# 输出: A.__private_method called

(1)A.__private_method 改写为 _A__private_method。

(2)B.__private_method 改写为 _B__private_method。

(3)子类不会覆盖父类方法。

四、注意事项与误区

1、名称改写不是严格的“私有”机制

Python 没有真正的私有属性,名称改写的目的在于避免冲突,而不是提供安全保护。

外部仍可以通过 _类名__name 形式访问。

2、不要滥用双前导下划线

如果只是“内部使用”,推荐用单下划线 _name。

双前导下划线仅在需要避免继承冲突时使用。

3、不要与特殊方法混淆

__init__、__len__、__str__ 等属于 Python 的魔术方法,不会触发名称改写。

小结

名称改写:当名字以双前导下划线开头但不以双下划线结尾时,Python 会将其改写为 _类名__name 。

作用:避免子类覆盖父类同名属性或方法。

注意:这不是严格的私有机制,依旧可以通过改写后的名字访问。

使用场景:在继承层次中保护基类实现不被子类误覆盖。

“点赞有美意,赞赏是鼓励”

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
贾乃亮带甜馨迪拜出游!甜馨长到认不出!和贾乃亮搞怪自拍

贾乃亮带甜馨迪拜出游!甜馨长到认不出!和贾乃亮搞怪自拍

喜欢历史的阿繁
2026-10-05 00:15:37
中国家门口生变,三国加速增兵,朝鲜凌晨行动,战略导弹准时入海

中国家门口生变,三国加速增兵,朝鲜凌晨行动,战略导弹准时入海

历史的烟火
2026-10-05 01:21:26
闹大了!标价25元剪发,剪完被加收10元!江门一理发店国庆临时加价还出言嘲讽顾客,被全网声讨

闹大了!标价25元剪发,剪完被加收10元!江门一理发店国庆临时加价还出言嘲讽顾客,被全网声讨

火山詩话
2026-10-04 08:53:17
贵州3岁坠楼男童已出院,母亲带纸条跪谢店主:我是聋哑人,只能把想说的话写纸上;店主:说实话受不起这一跪,毕竟只是凑巧雨棚救了小孩

贵州3岁坠楼男童已出院,母亲带纸条跪谢店主:我是聋哑人,只能把想说的话写纸上;店主:说实话受不起这一跪,毕竟只是凑巧雨棚救了小孩

大风新闻
2026-10-04 19:26:04
青萝卜被发现!医生发现:高血脂患者吃青萝卜,或出现5个变化

青萝卜被发现!医生发现:高血脂患者吃青萝卜,或出现5个变化

白宸侃片
2026-10-04 00:20:19
嫁78岁法国老头水落石出,42岁李宇春私生活曝光,丝毫不感到意外

嫁78岁法国老头水落石出,42岁李宇春私生活曝光,丝毫不感到意外

夏末的晨溪
2026-09-08 11:55:33
医生强烈提醒:明年开始,70岁以上长者请提前做好这3项生活准备

医生强烈提醒:明年开始,70岁以上长者请提前做好这3项生活准备

健康之光
2026-10-03 08:25:14
曾被誉为弗格森眼中的“下一块璞玉”,我却成了曼联水货——但我无怨无悔

曾被誉为弗格森眼中的“下一块璞玉”,我却成了曼联水货——但我无怨无悔

中场哨
2026-10-04 17:02:49
2026年了居然还能看到WE拯救赛区!某些人来错地方了

2026年了居然还能看到WE拯救赛区!某些人来错地方了

游戏馬蹄铁
2026-10-04 22:00:42
猛然发现,现今没人提固态电池了?后路都让抄了,大饼画不下去了

猛然发现,现今没人提固态电池了?后路都让抄了,大饼画不下去了

一路荒凉如歌a
2026-09-29 16:03:49
你的真实存款会瞒着身边亲近的人吗?网友:不要说不要说,一万也不要说

你的真实存款会瞒着身边亲近的人吗?网友:不要说不要说,一万也不要说

解读热点事件
2026-10-04 00:17:47
欠债40亿跑路,一家店平均只能存活16个月!昔日风口行业不香了?

欠债40亿跑路,一家店平均只能存活16个月!昔日风口行业不香了?

财经八卦
2026-07-26 17:46:53
中网16强决出8席,莱巴金娜萨巴伦卡接连出局,郑钦文升至替补第2位再退2人进正赛,孙心然夜场对阵高芙

中网16强决出8席,莱巴金娜萨巴伦卡接连出局,郑钦文升至替补第2位再退2人进正赛,孙心然夜场对阵高芙

爱体育的小悠悠
2026-10-05 01:21:12
刚拿到绿卡!30多岁中国夫妇澳洲车祸身亡

刚拿到绿卡!30多岁中国夫妇澳洲车祸身亡

看看新闻Knews
2026-10-04 00:23:54
画面公开!金正恩现场观摩朝鲜中程战略导弹发射训练:要以强大的遏制力管控各种威胁,为国家建设保证安全环境

画面公开!金正恩现场观摩朝鲜中程战略导弹发射训练:要以强大的遏制力管控各种威胁,为国家建设保证安全环境

台州交通广播
2026-10-04 07:03:03
1999年,69岁禹作敏狱中难耐孤寂,死前曾向李瑞环提出:我想回家

1999年,69岁禹作敏狱中难耐孤寂,死前曾向李瑞环提出:我想回家

华人星光
2026-04-20 09:59:15
春天来了,山东高速男篮冲击四强有望,最强形态有望本赛季实现!

春天来了,山东高速男篮冲击四强有望,最强形态有望本赛季实现!

过期少女致幻录
2026-10-04 21:51:42
社保挂靠:钱全部自己交,国家没少收钱,凭什么还违法?

社保挂靠:钱全部自己交,国家没少收钱,凭什么还违法?

你在偷看谁
2026-10-03 18:28:09
第一集就爆了!Netflix又杀疯了

第一集就爆了!Netflix又杀疯了

君君电影院
2026-10-05 00:30:58
原来红果短剧广告能关,以后看短剧又快多了

原来红果短剧广告能关,以后看短剧又快多了

喜欢历史的阿繁
2026-10-04 01:52:22
2026-10-05 05:27:00
MediaTea
MediaTea
专业的数字媒体、新媒体技术
2214文章数 85关注度
往期回顾 全部

科技要闻

苹果确认:iPhone 18 Pro Max有问题

头条要闻

30多岁中国夫妇在澳洲遇惨烈车祸丧生 肇事司机仅17岁

头条要闻

30多岁中国夫妇在澳洲遇惨烈车祸丧生 肇事司机仅17岁

体育要闻

32胜0负!德约2-1逆转头号种子兹维列夫 第7次晋级中网四强

娱乐要闻

高晓松悄悄复出:官媒没给他留体面

财经要闻

OpenAI前安全部门员工:公司文化已崩坏

汽车要闻

方程豹9月热销破4万 首款皮卡鲨鱼将于四季度上市

态度原创

健康
房产
旅游
教育
军事航空

刷酸祛痘,为什么有人翻车?

房产要闻

保利大爆发,冲到榜一!海南楼市前三季度,热销榜出炉!

旅游要闻

又是为了流量的造谣抹黑!官方通报“阿尔山景区二百一晚的大酒店”

教育要闻

家长注意:节假日期间,南京多所学校体育场对外开放!

军事要闻

驻冲绳美军士兵抢劫杀人 日本向美国提出抗议

无障碍浏览 进入关怀版