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

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.dtcms.com/a/279135.html

相关文章:

  • 【字节跳动】数据挖掘面试题0017:推荐算法:双塔模型,怎么把内容精准地推送给用户
  • ATE - Force模式和Meas模式
  • AI Agent vs SaaS:企业服务产品正迈向“智能中枢”阶段
  • Linux中使用云仓库上传镜像和私库制作Registry
  • 算法-练习题
  • 【牛客刷题】小红的数字删除
  • 可达性统计(拓扑排序模板,bitset)
  • 【算法】贪心算法:最大数C++
  • Linux 音频的基石: ALSA
  • 【云服务器安全相关】如何使用 `ping` 命令排查云服务器网络连接问题
  • javascript自执行函数
  • Retinex视网膜算法(SSR、MSR、MSRCR)
  • DNS重绑定
  • 纯净系统清理工具,告别卡顿烦恼
  • iOS高级开发工程师面试——RunTime
  • 构建完整工具链:GCC/G++ + Makefile + Git 自动化开发流程
  • 数字影像产业新机遇 入驻国际数字影像产业园享151项服务
  • 【人工智能】通过 Dify 构建智能助手
  • Day34 Java方法05 可变参数
  • JavaScript中Object.defineProperty的作用和用法以及和proxy的区别
  • 优化菜品呈现:让菜品自己 “开口” 求传播
  • 【ASP.NET Core】内存缓存(MemoryCache)原理、应用及常见问题解析
  • 我的Qt八股文笔记2:Qt并发编程方案对比与QPointer,智能指针方案
  • 电气安全监测系统:筑牢电气安全防线
  • DAOS系统架构-Container
  • 壹[1],异步与多线程
  • 美联储降息趋缓叠加能源需求下调,泰国证券交易所新一代交易系统架构方案——高合规、强韧性、本地化的跨境金融基础设施解决方案
  • 【Linux】Ubuntu22.04安装zabbix
  • 固态金属储氢实用化提速:新氢动力 20 公斤级系统重磅发布
  • GaussDB in的用法