Python没有private关键字,却用两条下划线构筑了精妙的访问控制体系——这是开发者自律与语言智慧的完美平衡。
下划线法则:Python的权限密码
|
前缀形式 |
技术机制 |
访问范围 |
典型场景 |
|
|
无修饰 |
完全公开 |
公共API接口 |
|
|
约定规范 |
模块/类内部 |
保护属性、工具函数 |
|
|
名称修饰 |
类内私有 |
关键数据封装 |
|
|
保留魔法方法 |
系统级调用 |
|
名称修饰:编译时的变形术
class SecureData:
def __init__(self):
self.__secret = "NSA级加密数据" # 变形为_SecureData__secret
obj = SecureData()
print(obj.__dict__) # 输出{'_SecureData__secret': 'NSA级加密数据'}
- 解释器在编译时自动重写双下划线变量
- 防止子类意外覆盖父类属性
- 非真正私有:仍可通过变形名访问
属性控制:@property的优雅封印
class BankAccount:
def __init__(self):
self._balance = 0 # 保护属性
@property
def balance(self): # 只读视图
return self._balance
@balance.setter
def balance(self, value): # 写入校验
if value < 0:
raise ValueError("余额不可为负")
self._balance = value
- 将方法伪装成属性访问
- 实现getter/setter逻辑控制
- 保持调用语法的简洁性
模块级防护:__all__的边界守卫
# module.py
__all__ = ['public_api'] # 限制from module import *的范围
def public_api(): pass
def _internal_helper(): pass # 隐藏内部实现
- 控制星号导入(
import *)的暴露范围 - 配合
_前缀实现模块接口最小化 - 遵循"宽进严出"的API设计原则
最佳实践:单下划线作警示牌,双下划线作安全门。下个思考:当使用__dict__突破封印直接访问私有变量时,我们究竟获得了自由,还是打开了潘多拉魔盒?

被折叠的 条评论
为什么被折叠?



