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

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-01-05 21:01:43
缺德到这种程度,已经没有半点“人性”了

缺德到这种程度,已经没有半点“人性”了

清书先生
2026-01-06 16:57:28
女人染上“性瘾”是一种怎样的体验?可能和你想象得不同

女人染上“性瘾”是一种怎样的体验?可能和你想象得不同

纸上的心语
2025-11-23 11:36:00
东风17不藏了,竹林起竖实弹画面首曝,台海点穴利器已就位

东风17不藏了,竹林起竖实弹画面首曝,台海点穴利器已就位

小涛叨叨
2026-01-04 19:15:26
多位市长升任市委书记!六地党委主要领导调整

多位市长升任市委书记!六地党委主要领导调整

上观新闻
2026-01-06 18:30:05
41岁演员白百何晒素颜上班照,并向网友发出“灵魂提问”,称自己想找个胶带把眼皮贴起来

41岁演员白百何晒素颜上班照,并向网友发出“灵魂提问”,称自己想找个胶带把眼皮贴起来

台州交通广播
2026-01-06 23:24:32
巴拿马总统:已正式通知中国,退出一带一路计划,中方送出4个字

巴拿马总统:已正式通知中国,退出一带一路计划,中方送出4个字

瞳哥视界
2026-01-05 21:48:45
3万股东踩雷,昨晚1公司终止上市,1公司摘牌退市,1实控人被逮捕

3万股东踩雷,昨晚1公司终止上市,1公司摘牌退市,1实控人被逮捕

财经智多星
2026-01-06 06:47:03
小鳌太线失联人员全部找到,本来有3次活命机会,却被白白浪费了

小鳌太线失联人员全部找到,本来有3次活命机会,却被白白浪费了

奇思妙想草叶君
2026-01-06 18:58:03
美军大批军机飞欧洲!调动模式与去年“空袭伊朗”惊人相似,抓一艘逃亡17天油轮?

美军大批军机飞欧洲!调动模式与去年“空袭伊朗”惊人相似,抓一艘逃亡17天油轮?

红星新闻
2026-01-06 19:14:23
新年听到的最心痛的一句话 | 何兰生

新年听到的最心痛的一句话 | 何兰生

农见度
2026-01-06 10:35:58
疯传!王石的瓜,好狗血!

疯传!王石的瓜,好狗血!

财经要参
2026-01-05 22:13:08
阳性!女孩柬埔寨流浪细节:被关了几天,从事工作曝光,拒绝回国

阳性!女孩柬埔寨流浪细节:被关了几天,从事工作曝光,拒绝回国

好贤观史记
2026-01-06 15:11:17
司法机关请回答:新华社功勋记者汤计,究竟有无“受贿房产”?

司法机关请回答:新华社功勋记者汤计,究竟有无“受贿房产”?

塔子山评说
2026-01-06 10:26:30
马杜罗穿囚服出庭,西方质问中国有能力保护朋友吗?结果怕啥来啥

马杜罗穿囚服出庭,西方质问中国有能力保护朋友吗?结果怕啥来啥

博览历史
2026-01-06 15:08:58
网传华侨城前董事长段先念,被抓了

网传华侨城前董事长段先念,被抓了

风向观察
2026-01-06 17:45:39
安徽小伙在小国家创业,“享受”一夫多妻、开放生活的他如今怎样

安徽小伙在小国家创业,“享受”一夫多妻、开放生活的他如今怎样

牛牛叨史
2026-01-06 12:59:43
刺激!苹果突然官宣:1月8日,新品正式发售!

刺激!苹果突然官宣:1月8日,新品正式发售!

科技堡垒
2026-01-06 11:41:33
“邓紫棋入围中国科幻最高奖”是乌龙?但让更多人关注中国科幻了

“邓紫棋入围中国科幻最高奖”是乌龙?但让更多人关注中国科幻了

澎湃新闻
2026-01-05 12:32:28
1米8美女长白山让座起冲突受伤!7000元和解,当事人:我没有输…

1米8美女长白山让座起冲突受伤!7000元和解,当事人:我没有输…

火山詩话
2026-01-06 08:58:27
2026-01-07 06:51:00
MediaTea
MediaTea
专业的数字媒体、新媒体技术
1690文章数 72关注度
往期回顾 全部

科技要闻

速看!黄仁勋万字实录:甩出"物理AI"王牌

头条要闻

特朗普:若输中期选举 我可能被弹劾

头条要闻

特朗普:若输中期选举 我可能被弹劾

体育要闻

从NBA最菜首发控卫,到NBA最强乔治

娱乐要闻

2026年央视春晚彩排照曝光!

财经要闻

50万亿存款"洪流"将至 四大去向引关注

汽车要闻

摩登出街潮品 实拍奇瑞QQ冰淇淋女王版

态度原创

手机
教育
房产
时尚
旅游

手机要闻

iPhone 17e曝光:2026年还有60Hz屏?

教育要闻

郑州测绘职院46个专业揭秘!别错过

房产要闻

爆发!三亚开年超千亩城更计划曝光,香港城砸下100亿!

冬天,“大衣”是中年女人的穿搭刚需,这样搭配时髦提气质

旅游要闻

浙江收入位居榜首,上海人均消费最高!长三角元旦旅游消费成绩单出炉啦

无障碍浏览 进入关怀版