当前位置: 首页 > web >正文

python 双下划线开头函数

在 Python 里,双下划线开头的函数(准确地说是方法)有着特殊的用途和意义。下面为你详细介绍相关内容:

1. 类的特殊方法(魔术方法)

以双下划线开头和结尾的方法,被称为特殊方法或者魔术方法(Magic Methods)。这些方法由 Python 解释器自动调用,我们可以通过重写它们来实现特定的类行为。

示例

class MyClass:def __init__(self, value):  # 实例初始化方法self.value = valuedef __str__(self):  # 定义实例的字符串表示return f"MyClass(value={self.value})"def __add__(self, other):  # 定义加法操作return MyClass(self.value + other.value)def __len__(self):  # 定义长度return len(str(self.value))

常用的魔术方法

  • __init__:对象初始化
  • __str____repr__:字符串表示
  • __len__:长度
  • __add____sub____mul__:算术运算符
  • __eq____lt____gt__:比较运算符
  • __iter____next__:迭代器协议
  • __getitem____setitem__:索引操作

2. 私有方法和名称修饰(Name Mangling)

以双下划线开头但不以双下划线结尾的方法,是类的私有方法。这类方法会通过名称修饰机制,使其在类外部难以直接访问。

示例

class MyClass:def __private_method(self):return "这是私有方法"def public_method(self):return self.__private_method()  # 类内部可以访问

名称修饰规则

  • 私有方法 __private_method 会被重命名为 _MyClass__private_method
  • 这种机制主要是为了避免子类意外覆盖父类的方法,而不是提供真正的访问限制
  • 虽然在类外部仍然可以访问 _MyClass__private_method,但不建议这么做

3. 与单下划线的区别

  • 单下划线(_method):这是一种约定,表示方法是受保护的(protected),不应该在类外部直接使用。不过 Python 并不会强制限制这种访问。
  • 双下划线(__method):会通过名称修饰机制,让方法更难以被外部访问,主要用于避免子类命名冲突。

示例对比

class Parent:def _protected(self):  # 单下划线return "受保护的方法"def __private(self):  # 双下划线return "私有的方法"class Child(Parent):passc = Child()
print(c._protected())  # 可以正常调用
print(c._Parent__private())  # 可以访问,但需要使用修饰后的名称
print(c.__private())  # 报错:AttributeError

4. 注意事项

  • 避免过度使用双下划线:除非确实需要防止子类覆盖方法,否则建议使用单下划线来表示约定上的私有性。
  • 特殊方法和私有方法:不要混淆特殊方法(如 __str__)和私有方法(如 __private)。特殊方法是 Python 语言的一部分,而私有方法是类设计的一种选择。

总结

双下划线开头的方法在 Python 中具有特殊意义:

  • __method__ 是特殊方法,用于实现类的内置行为
  • __method 是私有方法,通过名称修饰来减少命名冲突
  • 合理使用这些方法可以让你的代码更加规范和健壮
http://www.xdnf.cn/news/15514.html

相关文章:

  • 网络协议和基础通信原理
  • Go泛型完全指南:从基础到实战应用
  • Fluent许可文件安装和配置
  • 车载诊断框架 --- 车载诊断GuideLine
  • 如何集成光栅传感器到FPGA+ARM系统中?
  • 如何更改Blender插件安装位置呢?
  • qt 使用memcpy进行内存拷贝时注意的问题
  • 硬盘爆满不够用?这个免费神器帮你找回50GB硬盘空间
  • EasyExcel实现Excel文件导入导出
  • [Nagios Core] 事件调度 | 检查执行 | 插件与进程
  • 解决Qt中“known incorrect sRGB profile“警告的Photoshop修改方法
  • 如何基于FFMPEG 实现视频推拉流
  • DataWhale AI夏令营 Task2笔记
  • asyncio.Task` 的工作机制与高级应用
  • 嵌入式硬件篇---单稳态多谐施密特电路
  • 【WRFDA实操第一期】服务器中安装 WRFPLUS 和 WRFDA
  • 2025年睿抗机器人开发者大赛CAIP-编程技能赛本科组(省赛)解题报告 | 珂学家
  • Python `WeakValueDictionary` 用法详解
  • Kotlin委托
  • python的小学课外综合管理系统
  • MFC UI大小改变与自适应
  • ICMP隧道工具完全指南:原理、实战与防御策略
  • SwiftUI 全面介绍与使用指南
  • 【Docker基础】Dockerfile指令速览:健康检查与启动指令详解
  • Spark SQL 之 UT
  • Linux操作系统从入门到实战(七)详细讲解编辑器Vim
  • C++-多态
  • 现场设备无法向视频汇聚EasyCVR视频融合平台推流的原因排查与解决过程
  • Java Integer包装类缓存机制详解
  • python中正则相关:正则概述,匹配数字,匹配单词,匹配字符开头与结尾,单词的边界检测