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

python下划线开头函数总结

在Python中,以双下划线 __ 开头的函数(或变量)具有特殊的命名含义,主要用于实现类的私有成员、魔法方法(特殊方法)和名称修饰(Name Mangling)机制。下面详细解释这三种情况:

1. 魔法方法(特殊方法)

以双下划线开头并结尾的方法(如 __init____str__)称为魔法方法(Magic Methods)或特殊方法(Special Methods)。这些方法由Python解释器自动调用,用于实现类的内置行为。

常见魔法方法示例
class MyClass:def __init__(self, value):  # 构造函数,创建对象时自动调用self.value = valuedef __str__(self):  # 对象转字符串时调用(如print())return f"MyClass(value={self.value})"def __add__(self, other):  # 定义加法操作(如obj1 + obj2)return MyClass(self.value + other.value)def __len__(self):  # 定义长度(如len(obj))return 1
调用示例
a = MyClass(10)
b = MyClass(20)
print(a + b)      # 自动调用 __add__ 和 __str__
print(len(a))     # 自动调用 __len__

2. 私有方法和属性(名称修饰)

以双下划线开头但不以双下划线结尾的方法(如 __private_method)是类的私有成员,通过名称修饰(Name Mangling)机制实现一定程度的访问限制。

名称修饰规则

Python会将类中的 __private_method 重命名为 _类名__private_method,使得该方法在类外部难以直接访问,但并非完全禁止。

示例代码
class MyClass:def __public_method(self):print("这是公开方法")def __private_method(self):print("这是私有方法")def call_private(self):self.__private_method()  # 类内部可以正常调用obj = MyClass()
obj.__public_method()     # 正常调用
# obj.__private_method()  # 报错:AttributeError
obj._MyClass__private_method()  # 可以访问,但不推荐(违反封装原则)

3. 与单下划线 _ 的区别

  • 单下划线 _method:约定俗成的弱私有成员,仅作为开发者之间的约定,外部仍可访问。
  • 双下划线 __method:通过名称修饰实现的强私有成员,外部访问需通过 _类名__method
示例对比
class MyClass:def _single_underscore(self):print("单下划线方法")def __double_underscore(self):print("双下划线方法")obj = MyClass()
obj._single_underscore()     # 可以正常调用(约定不调用)
obj._MyClass__double_underscore()  # 可以调用(但破坏封装)

4. 使用场景建议

  • 魔法方法:用于实现类的特殊行为,如运算符重载、对象创建和销毁等。
  • 私有方法:用于隐藏类的内部实现细节,避免外部直接调用(但需注意并非绝对安全)。
  • 单下划线:用于模块级的私有成员(导入时 from module import * 不会导入)或内部临时变量。

总结

命名方式含义示例
__method__魔法方法,Python内置行为__init__, __add__
__method私有方法,通过名称修饰实现封装__private_method
_method弱私有,约定不被外部直接访问_helper_method

双下划线命名是Python实现封装和特殊行为的重要机制,合理使用可以提高代码的可读性和可维护性。

http://www.lryc.cn/news/578428.html

相关文章:

  • 服务器安装 ros2时遇到底层库依赖冲突的问题
  • Crystaldiskinfo查询的硬盘参数信息
  • 2.3.1 Nginx Web服务器安全加固
  • 基于Pandas和FineBI的昆明职位数据分析与可视化实现(四)- 职位数据可视化(FineBI)
  • 【开源项目】一款真正可修改视频MD5工具视频质量不损失
  • Python 数据分析:numpy,抽提,布尔索引2。
  • github代码中遇到的问题-解决方案
  • 【C++】备忘录模式
  • mini-electron使用方法
  • 时空数据挖掘五大革新方向详解篇!
  • 多探头分布式雷达测流系统解决方案概述
  • HakcMyVM-Arroutada
  • 软考中级【网络工程师】第6版教材 第1章 计算机网络概述
  • CompletableFuture源码分析
  • Android 网络全栈攻略(四)—— TCPIP 协议族与 HTTPS 协议
  • 计算机网络:【socket】【UDP】【地址转换函数】【TCP】
  • 基于Netty-WebSocket构建高性能实时通信服务
  • CloudBase AI ToolKit实战:从0到1开发一个智能医疗网站
  • ethtool -S dev 计数
  • Docker进阶命令与参数——AI教你学Docker
  • 内网和外网可以共享一台打印机吗?怎么设置实现跨网电脑远程连接打印
  • 【LlamaIndex核心组件指南 | Prompt篇】深度解析LlamaIndex提示模板的设计与实战
  • 原神八分屏角色展示页面(纯前端html,学习交流)
  • browser-tools-mcp + excel-mcp-server + cursor 实现读取网页信息自动写入Excel
  • 4D 毫米波雷达
  • 注意力得分矩阵求解例子
  • AR衍射光波导设计遇瓶颈,OAS 光学软件来破局
  • mac部署dify
  • SQL Server 进阶:递归 CTE+CASE WHEN 实现复杂树形统计(第二课)
  • 大模型-分布式论文一瞥