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

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-05-15 06:21:43
世界波!刘雨希扫射建功,破U17亚洲杯11年魔咒,张琳艳后首人

世界波!刘雨希扫射建功,破U17亚洲杯11年魔咒,张琳艳后首人

奥拜尔
2026-05-14 20:21:24
U17亚洲杯八强对阵:国少vs沙特,乌兹别克斯坦vs韩国

U17亚洲杯八强对阵:国少vs沙特,乌兹别克斯坦vs韩国

懂球帝
2026-05-14 11:43:31
一男子在35楼大厦擦玻璃被男孩割断安全绳,父母看到孩子死相崩溃

一男子在35楼大厦擦玻璃被男孩割断安全绳,父母看到孩子死相崩溃

悬案解密档案
2025-05-10 11:18:43
百名ABC前记者联名力挺:这是政治报复,不是监管执法

百名ABC前记者联名力挺:这是政治报复,不是监管执法

追星雷达站
2026-05-14 06:38:36
贾跃亭重掌大权后首份财报!FF一季度营收51.2万美元 亏损3885万美元

贾跃亭重掌大权后首份财报!FF一季度营收51.2万美元 亏损3885万美元

快科技
2026-05-15 06:32:04
马斯克说会谈很顺利,黄仁勋点赞、库克比耶

马斯克说会谈很顺利,黄仁勋点赞、库克比耶

财闻
2026-05-14 13:34:16
心理学上有一个说法叫稀缺心态:如果你发现一个人很“抠”,那“抠”只会是他身上最小的问题。你还是赶紧跑路要紧

心理学上有一个说法叫稀缺心态:如果你发现一个人很“抠”,那“抠”只会是他身上最小的问题。你还是赶紧跑路要紧

心理观察局
2026-05-14 09:29:44
每体:阿韦洛亚回击姆巴佩,称缺席四天前比赛就不该首发

每体:阿韦洛亚回击姆巴佩,称缺席四天前比赛就不该首发

懂球帝
2026-05-15 06:21:42
海顿·潘妮蒂尔自曝18岁被迫与名人发生关系

海顿·潘妮蒂尔自曝18岁被迫与名人发生关系

娱圈观察员
2026-05-12 13:14:49
沉默1日,大陆亮出统一底牌

沉默1日,大陆亮出统一底牌

一口娱乐
2026-05-14 07:21:58
百亿富家女留学英国,倒贴软饭男被打致死,前雨润总裁之女被杀案

百亿富家女留学英国,倒贴软饭男被打致死,前雨润总裁之女被杀案

汉史趣闻
2026-03-17 10:00:51
傅园慧被特聘为“浙江省校园反诈宣传形象大使”,称自己有“接电话恐惧症”,曾接到机票改签诈骗电话,险些被骗

傅园慧被特聘为“浙江省校园反诈宣传形象大使”,称自己有“接电话恐惧症”,曾接到机票改签诈骗电话,险些被骗

环球网资讯
2026-05-13 19:13:14
蔚来次子,开始赚钱养家了

蔚来次子,开始赚钱养家了

亿欧
2026-05-14 18:01:16
不少女网约车司机宣布退出女性友好计划,直言不想接女乘客

不少女网约车司机宣布退出女性友好计划,直言不想接女乘客

映射生活的身影
2026-05-12 20:56:00
祝福!48岁全红婵母亲住院 19岁全妹陪床 有钱不用再为医药费发愁

祝福!48岁全红婵母亲住院 19岁全妹陪床 有钱不用再为医药费发愁

念洲
2026-05-14 20:24:50
主角:黄正经永远没想到,把易青娥踢去烧火,反而帮花彩香布了局

主角:黄正经永远没想到,把易青娥踢去烧火,反而帮花彩香布了局

情感大头说说
2026-05-15 05:00:56
气象站——便携式气象站的优势

气象站——便携式气象站的优势

测控技术有限公司
2025-08-26 16:51:10
我有一个男朋友, 可他从不碰我,同居了一个月后我发现他有问题

我有一个男朋友, 可他从不碰我,同居了一个月后我发现他有问题

皓皓情感说
2026-05-14 15:11:12
金曲奖来了,看完提名名单,我要说:华语乐坛完了!

金曲奖来了,看完提名名单,我要说:华语乐坛完了!

八卦南风
2026-05-13 18:27:59
2026-05-15 07:36:49
MediaTea
MediaTea
专业的数字媒体、新媒体技术
1826文章数 80关注度
往期回顾 全部

科技要闻

马斯克说会谈很顺利 黄仁勋点赞 库克比耶

头条要闻

马斯克幼子装扮“火”了 衣服包包都是中国造

头条要闻

马斯克幼子装扮“火”了 衣服包包都是中国造

体育要闻

争议抽象天王山,和季后赛最稳定中锋

娱乐要闻

何九华官宣当爸!全程不提孩子妈

财经要闻

李强会见美国工商界代表

汽车要闻

双零重力座椅/AI智能体/调光天幕 启境GT7内饰发布

态度原创

亲子
房产
时尚
本地
健康

亲子要闻

孤独症特教老师的工作,远不止“教说话”!(下)

房产要闻

海南楼市新政要出!拟调公积金贷款额度,最高可贷168万!

白色上衣+彩色下装:今年夏天最火搭配,时髦又减龄!

本地新闻

用苏绣的方式,打开江西婺源

专家揭秘干细胞回输的安全风险

无障碍浏览 进入关怀版