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

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.

相关推荐
热点推荐
骑兵连见死不救,解放军5名师级干部牺牲,战后连长指导员被枪毙

骑兵连见死不救,解放军5名师级干部牺牲,战后连长指导员被枪毙

云端书馆
2026-08-15 07:19:32
河南一景区电子屏“吹空调”走红,景区:目的为缓解游客心情,气温超35‌℃才开放,目前已改播其他内容

河南一景区电子屏“吹空调”走红,景区:目的为缓解游客心情,气温超35‌℃才开放,目前已改播其他内容

极目新闻
2026-08-15 16:33:12
断粮45天!菲律宾撑不住了,国防部亮明:再不拖走破军舰后果自负

断粮45天!菲律宾撑不住了,国防部亮明:再不拖走破军舰后果自负

叹知
2026-08-17 06:38:35
英媒曝光俄绝密文件:一旦俄与北约开战,普京先打中国的两个邻国

英媒曝光俄绝密文件:一旦俄与北约开战,普京先打中国的两个邻国

马贪在解说
2026-08-14 05:31:33
四川大哥践诺“照看老屋”留守深山 25年后房主回乡卖房发现他还在丨看见正能量

四川大哥践诺“照看老屋”留守深山 25年后房主回乡卖房发现他还在丨看见正能量

封面新闻
2026-08-17 20:30:31
现场直击|蒙古国环境部副部长答新浪财经:中蒙已就沙尘暴问题展开多次对话,相关成果将于8月26日宣布

现场直击|蒙古国环境部副部长答新浪财经:中蒙已就沙尘暴问题展开多次对话,相关成果将于8月26日宣布

新浪财经
2026-08-18 21:28:01
菲律宾惨败,中国赢了,不表态了。

菲律宾惨败,中国赢了,不表态了。

经点星娱
2026-08-17 22:53:06
涉案金额过亿 刘应成(原法名释永信)一审被判有期徒刑24年

涉案金额过亿 刘应成(原法名释永信)一审被判有期徒刑24年

每日经济新闻
2026-05-30 00:42:59
程梦圆去世后,村里人说出22年的秘密:没有血缘,却是全家的团宠

程梦圆去世后,村里人说出22年的秘密:没有血缘,却是全家的团宠

社会日日鲜
2026-08-18 06:59:07
我的天呢!哈登或将重返火箭?3.8亿豪赌,火箭冒险冲季后赛!

我的天呢!哈登或将重返火箭?3.8亿豪赌,火箭冒险冲季后赛!

云隐南山
2026-08-18 13:32:55
世体:因黄潜已付罗德里首注册费用,巴萨省下5.8万欧注册费

世体:因黄潜已付罗德里首注册费用,巴萨省下5.8万欧注册费

懂球帝
2026-08-18 15:37:30
郝帅:现在超一流球员发球接发球都好 国乒小将技术太平庸怎么跟人家打

郝帅:现在超一流球员发球接发球都好 国乒小将技术太平庸怎么跟人家打

818体育
2026-08-18 10:06:35
官方通报杭州酒局事件:赵某峰郁某栋被刑拘

官方通报杭州酒局事件:赵某峰郁某栋被刑拘

观察者网
2026-08-18 17:34:05
林青霞合影几乎没输过,唯独遇上胡因梦,气质高下立判

林青霞合影几乎没输过,唯独遇上胡因梦,气质高下立判

动物奇奇怪怪
2026-08-17 00:23:36
瞒不住了?李小冉5亿宠婚骗局曝光,11年丁克崩盘,郭京飞一针见血

瞒不住了?李小冉5亿宠婚骗局曝光,11年丁克崩盘,郭京飞一针见血

荒野老五
2026-08-15 22:46:34
美媒:中国六代机试飞高难度动作,完成一项壮举!

美媒:中国六代机试飞高难度动作,完成一项壮举!

兵国大事
2026-08-18 00:05:13
59岁王祖贤摘口罩,退圈22年来首次公开露面,网易为何面子这么大

59岁王祖贤摘口罩,退圈22年来首次公开露面,网易为何面子这么大

李昕言温度空间
2026-08-16 10:38:10
胡锡进也去电影院看了《牛来》,直言电影虽烂但却给人带来欢笑

胡锡进也去电影院看了《牛来》,直言电影虽烂但却给人带来欢笑

映射生活的身影
2026-08-17 15:11:58
有影院下架《牛来》,工作人员称片子那么差为什么要看;该片票房已破350万元

有影院下架《牛来》,工作人员称片子那么差为什么要看;该片票房已破350万元

新快报新闻
2026-08-16 14:17:06
官媒曝光韩红真实籍贯,不是西藏和北京,原来她和成龙是同类人

官媒曝光韩红真实籍贯,不是西藏和北京,原来她和成龙是同类人

调侃国际观点
2026-06-29 04:45:48
2026-08-18 22:08:50
MediaTea
MediaTea
专业的数字媒体、新媒体技术
2070文章数 86关注度
往期回顾 全部

科技要闻

英伟达的资本局:从AI卖铲人到AI央行

头条要闻

煤老板因"山西前首富"赴赌致贫 全部身家遭其暴力掠夺

头条要闻

煤老板因"山西前首富"赴赌致贫 全部身家遭其暴力掠夺

体育要闻

中国男篮,一直被质疑,永远被期待

娱乐要闻

蓝盈莹官宣新恋情

财经要闻

一场酒局献祭,掀开了杭州地产潜规则

汽车要闻

综合续航超1400km 钛7DM长续航版售19.58万元起

态度原创

教育
时尚
数码
本地
家居

教育要闻

学校管理:管的是“序”,安的是人心

当超模不再藏起妊娠纹,谁还在贩卖焦虑?

数码要闻

哈浮VERSA飞行云台相机发布:2999元起 可拆卸模块化设计

本地新闻

邂逅活珊瑚的西沙,感受独属于国人的浪漫

家居要闻

2026建博会(广州) 公装联探展交流活动

无障碍浏览 进入关怀版