苦练Python第48天:类的私有变量“防身术”,把秘密藏进类里!
苦练Python第48天:类的私有变量“防身术”,把秘密藏进类里!
ZhangCurry苦练Python第48天:类的私有变量“防身术”,把秘密藏进类里!
🧐 为什么需要“藏起来”?
在 Python 里,属性默认全是 public,就像把银行卡密码贴在额头上——谁都能改。
当你写了一个类给别人用:
1 | class Person: |
用户小手一抖:
1 | p = Person(100) |
于是我们需要“私有变量”——给属性加一把锁,让外部“看不见、摸不着”。
🔒 第一招:单下划线 _ ——约定俗成
Python 没有真正的 private,但社区有默契:
带一个下划线的变量,请把它当私有,别直接碰!
1 | class Wallet: |
外部依旧能访问,但 IDE 会画波浪线提醒你:
1 | w = Wallet(50) |
✅ 适用场景:团队协作,靠“羞耻心”防误用。
🔐 第二招:双下划线 __ ——名字改写(Name Mangling)
Python 解释器会把 __var 改名成 _类名__var,外部直接访问会 AttributeError。
1 | class Wallet: |
外部尝试:
1 | w = Wallet(100) |
✅ 适用场景:防止 子类意外覆盖,写库、写框架必备。
🧪 动手实验:继承场景大 PK
1️⃣ 单下划线在继承中会被覆盖
1 | class Base: |
2️⃣ 双下划线不会被覆盖
1 | class Base: |
结论:
__能避免子类“踩坏”父类的私有实现。
🧰 第三招:@property 优雅封装
如果既想隐藏又想暴露只读接口,用 property 把变量包成“带门禁的房子”:
1 | class Wallet: |
使用姿势:
1 | w = Wallet(100) |
🍯 彩蛋:私有变量速查表
| 写法 | 能否直接访问 | 能否被子类覆盖 | 典型用途 |
|---|---|---|---|
var |
✅ | ✅ | 公有属性 |
_var |
✅(不推荐) | ✅ | 内部使用/保护属性 |
__var |
❌ | ❌ | 私有实现/防止覆盖 |
@property |
✅(只读) | ✅ | 安全暴露 getter |
🎤 一句话总结
Python 的“私有”靠 约定+改名,牢记:
_var:兄弟别碰,碰了尴尬;__var:真·隐藏,子类也找不到;- 想优雅?
@property包一层!



