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

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.

相关推荐
热点推荐
白城地砖铺贴河床?当地回应:系必要的工程措施

白城地砖铺贴河床?当地回应:系必要的工程措施

极目新闻
2025-11-17 20:15:14
鸡肋家电横行,这7种收割中产,连“穷鬼”也不放过,全是智商税

鸡肋家电横行,这7种收割中产,连“穷鬼”也不放过,全是智商税

室内设计师有料儿
2025-11-14 21:32:02
雷军心态崩了!小米汽车很安全,都是有人在故意抹黑

雷军心态崩了!小米汽车很安全,都是有人在故意抹黑

热点菌本君
2025-11-17 15:51:39
破产后,王中磊搬新家还住别墅,院子稀稀拉拉,老婆叹回不到以前

破产后,王中磊搬新家还住别墅,院子稀稀拉拉,老婆叹回不到以前

阿讯说天下
2025-11-16 15:01:59
出差2个月把家中地暖断掉,楼上却在群里骂我,她家楼上也断掉地暖

出差2个月把家中地暖断掉,楼上却在群里骂我,她家楼上也断掉地暖

悬案解密档案
2025-11-03 10:32:45
南京到无锡规划地铁通联?最新回应

南京到无锡规划地铁通联?最新回应

江南晚报
2025-11-17 21:17:03
G20峰会遇冷,“上三常”元首同时缺席,全球格局将如何演变?

G20峰会遇冷,“上三常”元首同时缺席,全球格局将如何演变?

优趣纪史记
2025-11-17 10:10:00
中央纪委国家监委网站:3人被查,3人被处分

中央纪委国家监委网站:3人被查,3人被处分

鲁中晨报
2025-11-17 23:10:03
乌军大捷,俄没钱的时候战争就会停止

乌军大捷,俄没钱的时候战争就会停止

难得君
2025-11-16 16:47:26
牛莉整容失败?母女被偶遇,女儿胸围暴涨,为防骚扰坐女性专车

牛莉整容失败?母女被偶遇,女儿胸围暴涨,为防骚扰坐女性专车

八星人
2025-11-17 15:04:56
狗主人遭反杀案:若国内有“无限防卫”,就不会有诸多争议

狗主人遭反杀案:若国内有“无限防卫”,就不会有诸多争议

胡言炫语
2025-11-18 01:36:03
中国车企突然遭遇缺芯威胁

中国车企突然遭遇缺芯威胁

后视镜里de未来
2025-11-17 10:50:25
胡春华发表署名文章

胡春华发表署名文章

社评
2025-10-31 10:11:37
哇,这脸蛋极致又高级,这要是在古代,妥妥的贵妃

哇,这脸蛋极致又高级,这要是在古代,妥妥的贵妃

阿废冷眼观察所
2025-11-16 00:59:32
上世纪50年代,到底杀了多少地主恶霸?公布的数据,让人不敢相信

上世纪50年代,到底杀了多少地主恶霸?公布的数据,让人不敢相信

文史道
2025-11-15 06:45:03
鸡排哥找不回自己,派头十足令人讨厌

鸡排哥找不回自己,派头十足令人讨厌

陈意小可爱
2025-11-18 03:01:41
见了美方后,郑丽文立场变了:台湾是“国家”,坚持“武力保台”

见了美方后,郑丽文立场变了:台湾是“国家”,坚持“武力保台”

顾史
2025-11-17 12:30:10
沙漠下面几乎全是石油,我国缺油年年大量进口,那为啥不开采呢?

沙漠下面几乎全是石油,我国缺油年年大量进口,那为啥不开采呢?

扶苏聊历史
2025-11-17 16:43:13
燕梳楼:如果日本驱逐薛剑,就是向中国宣战!

燕梳楼:如果日本驱逐薛剑,就是向中国宣战!

燕梳楼频道
2025-11-13 12:44:36
22分逆转5连胜!新鹰王上位特雷杨露馅 难怪老鹰不愿给4年2.29亿

22分逆转5连胜!新鹰王上位特雷杨露馅 难怪老鹰不愿给4年2.29亿

锅子篮球
2025-11-17 20:20:53
2025-11-18 11:35:00
MediaTea
MediaTea
专业的数字媒体、新媒体技术
1594文章数 70关注度
往期回顾 全部

科技要闻

马斯克破防了!贝索斯62亿美金入局"实体AI"

头条要闻

德媒:德副总理是"在艰难时期"访问中国 暗示不寻常

头条要闻

德媒:德副总理是"在艰难时期"访问中国 暗示不寻常

体育要闻

直到退役那天,“海湾梅西”也没去欧洲踢球

娱乐要闻

曝喻恩泰离婚2年前转移走300箱茅台?

财经要闻

青云租陷兑付危机 集资与放贷的双面生意

汽车要闻

更加豪华 更加全地形 极石ADAMAS

态度原创

本地
亲子
教育
艺术
公开课

本地新闻

这档古早综艺,怎么就成了年轻人的哆啦A梦?

亲子要闻

程晓玥怀二胎,孕肚明显,体重控制好,为双11推迟检查

教育要闻

雅思道歉!2023–2025部分成绩失准,可能被重算!

艺术要闻

优雅浪漫的绘画,美到让人想直接住进去!

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版