Python的私有方法技巧-双下划线开头

在 Python 中,以两个下划线开头 (如 __method)的方法或属性,并不完全是"私有方法"(private method)------因为 Python 并没有像 Java 或 C++ 那样严格的访问控制机制。但这种命名方式会触发一种叫做 名称改写(name mangling)的机制,从而在一定程度上实现"私有性"。

1. 名称改写(Name Mangling)

当你在一个类中定义一个以双下划线开头、且不以双下划线结尾的方法或属性时,Python 解释器会自动将其名称改写为:

复制代码
_ClassName__original_name

例如:

python 复制代码
class MyClass:
    def __init__(self):
        self.__private_var = 42

    def __private_method(self):
        return "This is private"

obj = MyClass()
# obj.__private_method()  # AttributeError!
print(obj._MyClass__private_method())  # 可以访问,但不推荐

虽然你仍然可以通过 _ClassName__name 的方式访问到这个"私有"成员,但这是一种约定+语言机制,目的是防止子类意外覆盖父类的内部方法,也提示开发者"这是内部使用的,不要直接调用"。


2. 与单下划线的区别

  • 单下划线开头 (如 _method):只是约定表示"内部使用",不会触发名称改写,外部仍可访问。
  • 双下划线开头 (如 __method):触发名称改写,提供更强的封装暗示。

3. 特殊方法(魔术方法)例外

注意:如果方法名前后都有两个下划线 (如 __init__, __str__),这是 Python 的特殊方法 (也叫魔术方法),不会被名称改写,也不表示私有,而是用于实现特定语言特性。


总结

  • Python 没有真正的"私有方法"。
  • __method 会被名称改写,起到模拟私有的作用。
  • 仍可通过 _ClassName__method 访问,但应避免这样做。
  • 这是一种约定 + 语言机制,用于封装和避免命名冲突。
相关推荐
ai小陈1 小时前
PyTorch DataLoader数据加载性能排查:GPU利用率低的实操指南
人工智能·pytorch·python·深度学习·ai·gpu算力
2601_962299244 小时前
Azure python操作系统列表
python·操作系统·azure·虚拟机·存储配置文件
学术 学术 Fun5 小时前
如何用 API 与 Webhook 批量把图表图片转换成 VSDX
python·自动化·api·visio
2601_962100546 小时前
python包和模块的内容整理
python·模块·导入·虚拟环境·
二进制漫游记6 小时前
FastAPI项目集成 Qdrant向量数据库+阿里云Embedding完整实战(工具封装+业务调用)
数据库·python·阿里云·embedding
-今昭-7 小时前
《V2V 迁移实战:将 VMware 虚拟机转为 OpenStack 可用 Glance qcow2 镜像》
开发语言·python
2601_962381587 小时前
【转】Python渗透测试工具:sqlmap
python·渗透测试·sql注入·sqlmap·数据库安全
用户3721574261358 小时前
如何使用 Python 从 Word 文档中提取图片
python
白山编程大哥9 小时前
Java 集合算法:从排序、查找到底层原理的实战指南
java·python·算法
昭昭日月明10 小时前
RAGFlow 入门,不用从零造轮子
python·ai编程